顺序自定义类型特征的行为就像一个

Sequential custom type traits behaving as one

本文关键字:一个 类型 自定义 特征 顺序      更新时间:2023-10-16

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

相关文章: