为了完成这个技巧,我们需要以下这个类,把它写在头文件中即可
template<typename T, int n>
class GlobalVar{
public:
static T var;
};
template<typename T, int n>
T GlobalVar<T, n>::var;
这样,我们便拥有了任意变量上任意数量的变量,而且,在用的时候它们才出现。注意:这里所谓的“用的时候”指的是编译期做出的判断,而不是运行时的自动创建。也就是说,我们并不需要定义,直接拿来用就可以。
看一个例子,我们可以在一个编译单元中使用如下代码为变量赋值:GlobalVar<int, 1>::var = 12345678;
而在另一个编译单元中读取该变量:
cout << GlobalVar<int, 0 >::var << endl;
详细解释:
在这里,我们利用了C++模板的一个特性——编译器保证具有相同模板参数的模板只实例化一次。也就是说,具有相同模板参数的GlobalVar中的静态变量var只被实例化一次。
如果我们想要定义另一个int型变量,只需要使用另一个n来实例化模板即可。
GlobalVar<int, 1>::var = 87654321;
此时,以上方法定义的全局变量在视觉上,不大像全局变量。但是大家可以使用宏定义等技巧来把它变得更像一点。