具有类型特征的模板元编程:为什么第一个代码编译而第二个代码没有编译?

时间:2016-12-15 04:37:42

标签: c++ templates template-meta-programming typetraits

我有两组代码,第一组代码按预期编译和运行,但[看起来]是不必要的冗长:

template<point_type type, typename T>
struct point2d_base {
    std::enable_if_t<std::is_arithmetic_v<T>, T> x, y;
    template<point_type t2 = type>
    point2d_base(std::enable_if_t<t2 == point_type::generic, T> x = 0, T y = 0) :
        x(x), y(y) {}
    template<point_type t2 = type>
    explicit point2d_base(std::enable_if_t<t2 != point_type::generic, T> x = 0, T y = 0) :
        x(x), y(y) {}
/*Some unrelated code*/
};

这是我反而写的代码,但如果我这样做,我会收到很多很多编译错误:

template<point_type type, typename T>
struct point2d_base {
    std::enable_if_t<std::is_arithmetic_v<T>, T> x, y;
    point2d_base(std::enable_if_t<type == point_type::generic, T> x = 0, T y = 0) :
        x(x), y(y) {}
    explicit point2d_base(std::enable_if_t<type != point_type::generic, T> x = 0, T y = 0) :
        x(x), y(y) {}
/*Some unrelated code*/
};

为了便于参考,point_type是一个&#34; Enum Class&#34;它包含三个值:genericcornercenter

我的问题是:为什么第一个代码编译,第二个代码没有?

1 个答案:

答案 0 :(得分:1)

您不能依赖模板类参数来使用std::enable_if。 如果要将std::enable_if与函数一起使用,则必须使该函数成为模板函数。 这是因为当您实例化类模板时,该类的所有成员函数也会实例化。您需要模板成员函数来有条件地启用该功能。 (这是我的猜测,我认为是正确的)