顺序自定义类型特征的行为就像一个
Sequential custom type traits behaving as one
我正在尝试定义自定义类型特征(我相对较新),以检查给定类型是否支持特定操作。如果我只有一个类型特征,它会按预期工作,但是如果我按顺序放置两个类型特征,它们的行为就像一个(当我使用第二个时,它会返回与第一个相同的结果)。我正在使用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: %dn", "is_comparable_by_equal_to",
is_comparable_by_equal_to<mClass>::value);
printf("%s: %dn", "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 编译了代码,它按预期工作。
事实证明,问题出在Visual Studio 2015编译器版本(VS2015更新2)中,当我更新到最新版本(更新3)时,它按预期工作。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 更改可变参数模板中的最后一个类型
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- 有没有办法同时将一个类型分配给C++中的多个模板?
- C++:可以模板化一个类型名称吗
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 给定一个类型为 Container:<T>:Iterator 的函数参数,如何为某些类型的 T 实现特定的重载?
- 期望一个类型,得到一个模板
- 初始化一个类型向量的巨大向量<int>
- 我可以使用预处理器将一个类型声明替换为另一个类型声明吗?
- 具有多种类型的类数组?如何访问数组中的一个类型
- Opencv C++ 声明一个类型为 uint8 的矩阵
- 模板参数列表中只有一个类型名称是什么意思?
- C++模板部分特化:为什么我无法匹配可变参数模板中的最后一个类型
- 为什么我们有一个类型不匹配
- 在函数模板中将一个类型名映射到另一个类型名
- 创建一个类型bool的向量,其中所有值均可初始化为true
- 在C API中定义了一个类型,如何将其与命名空间中的C++类相关联