【问题标题】:Sequential custom type traits behaving as one顺序的自定义类型特征表现为一个
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2019-12-08
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多