强制生成模板基本功能

时间:2018-07-22 17:06:56

标签: c++ templates crtp

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

这不是很优雅。

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

预先感谢

0 个答案:

没有答案