Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 顺序自定义类型特征作为一个_C++_Templates_C++14_Typetraits - Fatal编程技术网

C++ 顺序自定义类型特征作为一个

C++ 顺序自定义类型特征作为一个,c++,templates,c++14,typetraits,C++,Templates,C++14,Typetraits,我正在尝试定义自定义类型特征(我对它比较新),检查给定类型是否支持特定操作。如果我只拥有一个类型特征,它会按预期工作,但如果我按顺序放置两个类型特征,它们的行为都是一样的(当我使用第二个类型特征时,它会返回与第一个类型特征相同的结果)。 我正在使用VisualStudio2015(v140) 代码示例: #include <type_traits> template<typename T, typename = void> struct is_comparable_by

我正在尝试定义自定义类型特征(我对它比较新),检查给定类型是否支持特定操作。如果我只拥有一个类型特征,它会按预期工作,但如果我按顺序放置两个类型特征,它们的行为都是一样的(当我使用第二个类型特征时,它会返回与第一个类型特征相同的结果)。 我正在使用VisualStudio2015(v140)

代码示例:

#include <type_traits>

template<typename T, typename = void>
struct is_comparable_by_equal_to
    : std::false_type {};

template<typename T>
struct is_comparable_by_equal_to<T, typename std::enable_if<true,
    decltype(std::declval<T>() == std::declval<T>(), (void)0)>::type>
    : std::true_type {};

template<typename T, typename = void>
struct is_comparable_by_not_equal_to
    : std::false_type {};

template<typename T>
struct is_comparable_by_not_equal_to<T, typename std::enable_if<true,
    decltype(std::declval<T>() != std::declval<T>(), (void)0)>::type>
    : std::true_type {};

class mClass {
public:
    bool operator== (const mClass& obj) {
        return false;
    }
};

int main() {
    printf("%s: %d\n", "is_comparable_by_equal_to",
        is_comparable_by_equal_to<mClass>::value);
    printf("%s: %d\n", "is_comparable_by_not_equal_to",
        is_comparable_by_not_equal_to<mClass>::value);
}
#包括
模板
结构是可比的
:std::false_type{};
模板
结构是可比的
:std::true_type{};
模板
结构是可比的,不等于
:std::false_type{};
模板
结构是可比的,不等于
:std::true_type{};
类mClass{
公众:
布尔运算符==(常量mClass和obj){
返回false;
}
};
int main(){
printf(“%s:%d\n”,“是可比的”,
是可比的(等于::值);
printf(“%s:%d\n”,“可比于”不等于“,
是可比的(不等于::值);
}
结果输出:

可比与等于:1
是可比的还是不等于:1

预期结果输出:

可比与等于:1
是可比的还是不等于:0


问题是为什么以及如何解决这个问题?此外,我还愿意改进如何定义这种自定义类型特征。

我用g++-std=c++11编译了代码,它按预期工作


事实证明,问题出在Visual Studio 2015编译器版本(VS2015更新2)中,当我更新到最新版本(更新3)时,它按预期工作。

如果我使用
g++-std=c++11 traits.cpp
(或c++14)编译代码,我会得到预期结果。VS编译器
19.10.24903.0
给出预期结果,在这里尝试:使用clang++(3.5)和g++(4.9.2)的预期结果