单例 CRTP 与 meyers 单例

Singleton CRTP with meyers singleton

我正在尝试实现一个在内部使用 meyers singleton 的 Singleton 模板:

#include <bits/stdc++.h>

template <typename T>
class Singleton {
public:
    static T& instance() {
       static T _instance; 
       return _instance;
    }
protected:
    Singleton() = default;
    ~Singleton() = default;
    Singleton(const Singleton & s) = delete;
    Singleton& operator=(const Singleton & s) = delete;
};


class Foo : Singleton<Foo> {
public:
    void print() {
       std::cout<<"from the foo singleton count : " <<count++<<std::endl; 
    }
private:
    int count = 0;

};

int main () {
   Singleton<Foo>::instance().print();
   Singleton<Foo>::instance().print();
   Singleton<Foo>::instance().print();
   return 0; 

它似乎有效:link

但现在我希望能够像这样使用它:

Foo::instance().print();

有什么办法吗?

您应该阅读尝试调用 Foo::instance().print() 时产生的错误消息,因为它告诉您出了什么问题:

<source>:30:17: error: 'static T& Singleton<T>::instance() [with T = Foo]' is inaccessible within this context
   30 |    Foo::instance().print();
      |    ~~~~~~~~~~~~~^~

Singleton<T>::instance() 无法通过 Foo::instance() 访问,因为 Foo 是私有继承。使 Foo 公开继承并且有效。

您正在使用 class Foo : Singleton<Foo> 的私有继承,这意味着对外界来说,Foo 不是 Singleton<Foo> 并且它没有 instance 函数。您可以添加

using Singleton<Foo>::instance;

前往 Foo 的 public 部分。这会将 instance 函数导入 Foo 的 public space 并允许

Foo::instance().print();

编译。