顺序自定义类型特征表现为一个

时间:2017-01-21 16:50:45

标签: c++ templates c++14 typetraits

我试图定义自定义类型特征(我相对较新),检查给定类型是否支持特定操作。如果我只有一个类型特征它按预期工作,但如果我按顺序放置两个类型特征,它们都表现为一个(当我使用第二个时,它返回与第一个相同的结果)。 我正在使用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

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

1 个答案:

答案 0 :(得分:0)

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

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