模板价值的公共访问

时间:2016-09-30 21:40:47

标签: c++ templates

请考虑以下事项:

template<int T>
class Test {
public:
    constexpr static int A = T;
};

int main(int argsc, char** args) {
    std::cout << Test<2>::T << std::endl; // Option 1
    std::cout << Test<2>::A << std::endl; // Option 2
}

为什么没有选项1编译?似乎static constexpr A只是一个额外的步骤。是T是否公开发布?

是否有更简洁的方式来获取T,而不是创建一个可公开访问的成员,例如上面的A

1 个答案:

答案 0 :(得分:2)

  

为什么选项1没有编译?

因为模板参数只是参数的名称。您可以重命名它们,即:

template <class T> struct X;

// refers to same X
template <class U> struct X { ... };

// still the same X
template <class V>
void X<V>::foo() { ... };

出于同样的原因,您可以在声明和定义之间以不同方式命名函数参数。要求模板参数的名称在类模板中自动显示,这意味着必须先修复它。

  

是否有更简洁的方式来获得T而不是像上面的A那样创建一个可公开访问的成员?

创建可公开访问的成员通常是可行的方法。或者,您可以创建外部特征:

template <class T> struct X { using type = T; }; // internal

template <class > struct get_type;
template <class T> struct get_type<X<T>> { using type = T; }; // external