c++ - 强制生成模板基函数
问题描述
我正在使用奇怪的循环模板模式 (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();
这不是很优雅。
最后,我应该提一下,问题不在于如何处理单例。我使用上面的模式来制作对象发布者和订阅者、垃圾收集等。
提前致谢
解决方案
推荐阅读
- java - Wear Google 身份验证所需的最低 SDK
- webpack - 如何通过 webpack 4 压缩图像
- angular - RXJS - Angular - 取消订阅主题
- javascript - 函数 createIdentityMatrix(a,b)
- shiny - 如何根据闪亮应用程序中的选项卡选择实现条件输出
- r - 不知道如何为列表类型的对象自动选择比例。默认为连续
- visual-studio-2017 - 使用 Visual Studio 开发人员提示执行目标
- javascript - 无法让 React 组件显示 onClick
- haskell - 如何在QTree中定义
- hive - 无法通过 cli 启动 apache hive