我正在使用奇怪的循环模板模式(CRTP)提供功能,这要求为基类生成静态函数。通常,我忘了显式实例化函数,这会导致错误的行为(不生成函数)。下面显示了一个单例基类的简单示例。
#include <iostream>
template <class T>
class Singleton {
public:
static const T& InstanceGet() {
if (!pInstance) { pInstance = new T; }
return *pInstance;
}
static int InstanceDestroy() __attribute__((destructor));
protected:
Singleton() = default;
Singleton(Singleton const &) = delete;
Singleton& operator=(Singleton const &) = delete;
private:
static T* pInstance;
};
template <class T>
int Singleton<T>::InstanceDestroy() {
if (pInstance) {
delete pInstance;
pInstance = nullptr;
}
return 0;
}
template <class T>
T* Singleton<T>::pInstance = nullptr;
class Test : public Singleton<Test> {
friend class Singleton<Test>;
};
// Explicit instantiate destructor (otherwise not called)
// template int Singleton<Test>::InstanceDestroy();
int main(int argc, char* argv[]) {
const Test& pTest = Test::InstanceGet();
return 0;
}
如果我忘记显式实例化int Singleton<Test>::InstanceDestroy()
,则在卸载库时不会生成和调用该函数。问题:是否有自动方法来确保生成此类功能?
我找到了一种方法,但这在启动期间引入了虚拟调用。将以下常量添加到基类中
const int atexit = Singleton<T>::InstanceDestroy();
这不是很优雅。
最后,我应该提到的问题不是关于如何处理单例。我使用上面的模式来制作对象的发布者和订阅者,收集垃圾等。
预先感谢