首页 > 解决方案 > 强制生成模板基函数

问题描述

我正在使用奇怪的循环模板模式 (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();

这不是很优雅。

最后,我应该提一下,问题不在于如何处理单例。我使用上面的模式来制作对象发布者和订阅者、垃圾收集等。

提前致谢

标签: c++templatescrtp

解决方案


推荐阅读