我试图定义自定义类型特征(我相对较新),检查给定类型是否支持特定操作。如果我只有一个类型特征它按预期工作,但如果我按顺序放置两个类型特征,它们都表现为一个(当我使用第二个时,它返回与第一个相同的结果)。 我正在使用Visual Studio 2015(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);
}
结果输出:
is_comparable_by_equal_to:1
is_comparable_by_not_equal_to:1
预期结果输出:
is_comparable_by_equal_to:1
is_comparable_by_not_equal_to:0
问题是为什么以及如何解决问题?此外,我还打算如何定义这种自定义类型特征。
答案 0 :(得分:0)
我用g ++ -std = c ++ 11编译了代码,它按预期工作。
事实证明,问题出现在Visual Studio 2015编译器版本(VS2015更新2)中,当我更新到最新版本(更新3)时,它按预期工作。