2016-09-30 71 views
0

考虑以下几点:公共接入

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是否不公开?

有没有比上面创建可公开访问的成员A更清洁的方式获得T

+0

您不能在类之外访问模板参数。 – plasmacel

+0

@plasmacel - 为什么这是真的?创建'A'的步骤似乎没有必要。 – Jack

+1

您也可以创建一个允许检索模板参数的特征。 'template TestTrait;模板 TestTrait > struct {constexpr static int value = N; };' – Jarod42

回答

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?

创建可公开访问的成员通常是要走的路。或者,您可以创建一个外部特征:

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 
+0

如果'type'不是一个类型,而是一个'int'值,'use type = T'工作吗? – Jack

+0

@Jack不,你必须有'static constexpr int value = T;'我只是使用类型,因为类型更典型。 – Barry

+0

需要提及的是,您可以在类之外重命名参数的功能不排除通过其原始名称访问参数的功能,或者通过索引提取参数。所以它更像是标准的限制。 – plasmacel