【发布时间】:2018-07-30 15:16:57
【问题描述】:
使用 Meyers 单例时:
class Singleton
{
public:
static Singleton& instance()
{
static Singleton instance;
return instance;
}
void Hello()
{
std::cout <<"Hello!\n";
}
protected:
Singleton() = default;
~Singleton() {};
private:
Singleton(Singleton const&);
Singleton& operator=( Singleton const& );
};
您可以按如下方式调用实例:
Singleton::instance().Hello();
或
Singleton& s = Singleton::instance();
s.Hello();
但我想知道是否有办法阻止它:
Singleton::instance().instance();
如何避免将 instance() 作为方法调用(使用.)并且只支持使用:: 的静态调用?
有没有办法使用 static_assert、模板 enable_if 或其他任何东西?
【问题讨论】:
-
有什么理由要禁止它吗?只是好奇
-
您可以将生命周期管理外包到
SingletonHolder(可能是类模板)。这样,SingletonHolder<MyType>::instance()返回一个没有instance()方法的对象。请看“现代 C++ 设计”的第 6 章,其中详细介绍了这种包装器技术。 -
让 Meyer 的单身死去吧……
-
@Rakete1111 不,没有。我只想禁用它,因为它会误导调用另一个实例。因此,如果可能的话,我更喜欢使用 static_assert 的编译时错误。我不想为一件简单的事情做一个巨大的变通办法,如果不可能的话,我可以忍受它。只是想看看可能性,因为我自己找不到。
-
@Vuwox 这不是一种解决方法,Meyers 的 Singleton 在许多层面上都存在缺陷。 Singleton 的使用是有问题的,Meyers 是一个错误。
标签: c++ c++11 static singleton