您可以添加一个静态数据成员,该成员将在其构造函数和析构函数中执行所需的任何操作。您可以放心地将其定义放入头文件中,因为只要它是模板,它只会被定义一次。唯一的问题是要实例化它,您必须使用它。
template <typename T>
class Data {
public:
Data() {
std::cout << "creating Data<" << typeid(T).name() << '>' << std::endl;
}
~Data() {
std::cout << "destroying Data<" << typeid(T).name() << '>' << std::endl;
}
};
template<typename T>
class A {
static Data<T> data;
public:
A() {
// this is necessary for data to be instantiated
(void)data;
}
};
// This also should be in a header
template<typename T>
Data<T> A<T>::data;
int main(){
A<int> aInt;
A<int> aInt2;
A<float> aFloat;
}
演示
编辑:这实际上有点不安全,因为在不同的翻译单元中创建静态对象的顺序是未指定的,因此例如在执行时可能没有(所以不要在那里使用任何静态全局对象)std::cout
。Data::Data()
一种更安全的方法是在 中调用静态函数A::A()
,尽管它会引入一些开销:
template<typename T>
class A {
static void createData() {
static Data<T> data;
}
public:
A() {
createData();
}
};