【发布时间】:2017-01-21 16:50:44
【问题描述】:
我正在尝试定义自定义类型特征(我相对较新),检查给定类型是否支持特定操作。如果我只有一个类型特征,它会按预期工作,但是如果我按顺序放置两个类型特征,它们都表现为一个(当我使用第二个时,它返回与第一个相同的结果)。 我正在使用 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
问题是为什么以及如何解决这个问题?我也愿意改进如何定义此类自定义类型特征。
【问题讨论】:
-
如果我用
g++ -std=c++11 traits.cpp(或c++14)编译你的代码,我会得到预期的结果。 -
VS 编译器
19.10.24903.0给出了预期的结果,在这里试试:webcompiler.cloudapp.net -
clang++ (3.5) 和 g++ (4.9.2) 的预期结果
标签: c++ templates c++14 typetraits