【发布时间】:2019-09-16 06:39:38
【问题描述】:
我正在学习强制模板实例化。
它有效,但我仍然很好奇:-
#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#更改为template <T>struct NonTypeParameter { };并将#2#更改为public: using dummy=NonTypeParameter<init>;,我将得到:-错误:'T' 尚未声明
问题
为什么
#2#行足以强制实例化?
在我看来,它只是模板类中的 typedef ,任何人都无法访问。为什么我需要
int&作为另一个模板参数才能使其可编译?
一个可能更正确的问题:该技术的名称是什么?
【问题讨论】:
标签: c++ crtp template-instantiation