请考虑以下事项:
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
答案 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