我正在学习强制模板实例化。
它有效,但我仍然很好奇:-
#include <iostream>
#include <string>
template <typename T, T>struct NonTypeParameter { };//#1#
int lala=0;
template <typename T> class InitCRTP{
public: static int init;
public: using dummy=NonTypeParameter<int&, init>; //#2#
};
template <typename T> int InitCRTP<T>::init = lala++;
class WantInit : public InitCRTP<WantInit>{
};
int main(){
std::cout << lala << std::endl;
}
它打印 1,因为InitCRTP<WantInit>::init
已正确实例化。
观察
- 如果我删除该行
#2#
,它将打印 0。(InitCRTP<WantInit>::init
未实例化)。 如果我
#2#
从更改int&
为int
,我将得到:-错误:'InitCRTP::init' 的值在常量表达式中不可用
如果我改变
#1#
totemplate <T>struct NonTypeParameter { };
和#2#
topublic: using dummy=NonTypeParameter<init>;
我会得到:-错误:“T”尚未声明
问题
为什么这条线
#2#
足以强制实例化?
在我看来,它只是模板类中的一个 typedef,任何人都无法访问。为什么我需要
int&
作为另一个模板参数才能使其可编译?
一个可能更正确的问题:该技术的名称是什么?
原始帖子:使用 CRTP 强制显式模板实例化