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