Ben*_*ois 3 c++ templates template-specialization
让我们假设我声明了一个模板化的结构:
template <int N> struct mystruct;
Run Code Online (Sandbox Code Playgroud)
让我们假设我的结构对所有人都有一般行为N
,除非是N == 0
我可以声明一个特殊的行为N == 0
:
template<> struct mystruct<0> {int k = 0};
Run Code Online (Sandbox Code Playgroud)
我也可以用以下方式声明一般行为:
template<int N> struct mystruct {float k = 3.14;};
Run Code Online (Sandbox Code Playgroud)
如果我在主要运行:
struct mystruct<-1> x;
struct mystruct<0> y;
struct mystruct<1> z;
std::cout << x.k << " " << y.k << " " << z.k << std::endl;
Run Code Online (Sandbox Code Playgroud)
我得到了我想要的东西:3.14 0 3.14
无论模板声明的顺序如何.
但是我想知道这种行为是否有保险.的确,当我宣布:
struct mystruct<0> y;
在我看来,这也可以通过两种mystruct
实现来定义.
所以问题是:
C++规范化是否确保模板专门化<0>
覆盖一般基本实现<int N>
,无论代码中的模板专业化顺序是什么?
对于您的特定情况,因为专业化必须出现在主模板之后,并且假设它们都出现,那么是.否则,如果一个TU看到了特化,但是另一个没有并且它们都使用mystruct<0>
,那么你将得到未定义的行为.
在一般情况下,由于许多专业化可能相当复杂,C++标准在[temp.expl.spec]/7中有这样的说法,强调我的:
为函数模板,类模板,变量模板,类模板的成员函数,类模板的静态数据成员,类模板的成员类,类模板的成员枚举,类模板的成员类模板,成员函数放置显式特化声明类模板的模板,类模板的静态数据成员模板,类模板的成员模板的成员函数,非模板类的成员模板的成员函数,非模板类的静态数据成员模板,成员类的成员函数模板类模板等,以及类模板,变量模板,非模板类的成员类模板,非模板类的静态数据成员模板,类模板的成员类模板等的部分特化声明的放置,可以根据显式specia的相对位置来影响程序是否格式正确 翻译单元中的lization声明及其实例化点,如上下文所述.写专业时,要注意它的位置; 或者使它编纂将是一种试图点燃其自焚的试验.
归档时间: |
|
查看次数: |
108 次 |
最近记录: |