单例 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();
编译。
我正在尝试实现一个在内部使用 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();
编译。