C++模板类中如何实现所有实例共享的静态成员变量?
实现所有模板特化共享静态成员的方法
你现在的问题在于,模板类的静态成员默认是每个特化版本独立拥有的——也就是说A<int>::m和A<double>::m是完全不同的两个变量,直接写A::m也会因为未指定模板参数而编译失败。
不需要用全局变量,有几种干净的实现方式:
方法1:借助非模板基类共享静态成员
把静态成员放到一个非模板的基类里,让模板类继承这个基类。这样所有A<T>的实例都会共享基类的静态成员:
// 非模板基类,存放共享的静态成员 class ASharedBase { protected: static int m; }; // 定义基类的静态成员 int ASharedBase::m = 0; // 模板类继承基类 template<class T> class A : public ASharedBase { // 这里可以添加你的模板类其他成员 }; int main() { A<int>::m = 3; // A<double>::m 也会是3,因为共享同一个基类的m return 0; }
方法2:用静态成员函数封装静态局部变量
利用静态局部变量的特性——第一次调用时初始化,且整个程序生命周期只有一份实例。通过模板类的静态成员函数来返回这个变量:
template<class T> class A { public: static int& getM() { // 静态局部变量,所有调用getM()的地方共享同一个实例 static int m = 0; return m; } }; int main() { A<int>::getM() = 3; // A<char>::getM() 的值也会是3 return 0; }
补充说明
- 方法1的优点是可以直接像普通静态成员一样访问
m,缺点是基类的m对所有继承它的类可见(可以用protected控制访问权限)。 - 方法2的优点是更封装,
m的生命周期由函数管理,缺点是需要通过函数调用访问,不能直接写A<T>::m。
这两种方法都能避免使用全局变量,保持代码的封装性。
内容的提问来源于stack exchange,提问作者Cook
相关产品推荐
相关产品推荐

