添加链接 注册    登录
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
礼貌的机器人  ·  图解elasticsearch的_sourc ...·  1 年前    · 
咆哮的木瓜  ·  怎样用Python解压缩*.tgz文件-腾讯 ...·  2 年前    · 
聪明的炒饭  ·  Java对象转换成yaml文件_撖寡情頧流m ...·  3 年前    · 
神勇威武的馒头  ·  python五十七课——正则表达式(边界字符 ...·  3 年前    · 
link之家  ›  单例模式模板类构造函数可以带参数吗? - 拉维 的回答 -
构造函数 static 单例模式 模板类
https://www.zhihu.com/question/449263430/answer/1781713470
性感的大象
2 年前
单例模式模板类构造函数可以带参数吗?
拉维
拉维
SWE/C++/Linux/雪菜党

个人感觉如果没有特殊需求的话还是不用继承的方式直接写在一个类里就好,比如:

class A {
 public:
  static A* GetInstance() {
    static A a;
    return &a;
 private:
  A() = default;

C++11之后 static 的局部变量直接保证是线程安全的,初始化只被执行一次,想在构造函数里加什么参数直接加就好了

如果一定要用一个基类表示的话,考虑到构造函数的参数列表是不定的,保证线程安全的前提下一个比较简单的方法应该就是 @猪蹄酱 提到的 std::call_once 保证只初始化一次。试着按照这个思路写了个代码(第一次写这种模板代码,如有错误或更简化的方法欢迎指正)

template <class T>
class Singleton {
 public:
  Singleton(const Singleton&) = delete;
  Singleton& operator=(const Singleton&&) = delete;
  template <typename... Args>
  static T* GetInstance(Args&&... args) {
    std::call_once(init_flag_, Initialize<Args...>,
                   std::forward<Args>(args)...);
    return instance_;
 protected:
  Singleton() = default;
  ~Singleton() = default;
 private:
  template <typename... Args>
  static void Initialize(Args&&... args) {
    if (instance_ != nullptr) {
      return;
    instance_ = new T(std::forward<Args>(args)...);
    std::atexit(Destroy);
  static void Destroy() { delete instance_; }
  static T* instance_;
  static std::once_flag init_flag_;
 
推荐文章
礼貌的机器人  ·  图解elasticsearch的_source、_all、store和index-腾讯云开发者社区-腾讯云
1 年前
咆哮的木瓜  ·  怎样用Python解压缩*.tgz文件-腾讯云开发者社区-腾讯云
2 年前
聪明的炒饭  ·  Java对象转换成yaml文件_撖寡情頧流ml_仁王_雅治的博客-CSDN博客
3 年前
神勇威武的馒头  ·  python五十七课——正则表达式(边界字符) - 腾讯云开发者社区-腾讯云
3 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
link之家 - 链接快照平台
© 2024 ~ 沪ICP备11025650号