首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++单例实例禁用重新调用

C++单例实例禁用重新调用
EN

Stack Overflow用户
提问于 2018-07-30 15:16:57
回答 1查看 172关注 0票数 1

当使用Meyers单例时:

代码语言:javascript
复制
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& );
};

您可以按以下方式调用实例:

代码语言:javascript
复制
Singleton::instance().Hello();

代码语言:javascript
复制
Singleton& s = Singleton::instance();
s.Hello();

但我想知道是否有办法阻止这种情况:

代码语言:javascript
复制
Singleton::instance().instance();

如何避免将实例()作为方法调用(使用.),而只支持::的静态调用?

是否有一种使用static_assert、模板enable_if或其他什么的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-30 15:35:04

首先,我不认为这是一个实际的问题。没有人会写Singleton::instance().instance().instance().Hello()。或者更确切地说,如果人们是故意写的,我认为你有更大的问题。这很好,就像现在一样。

如果您真的想阻止这种情况,那么只需将instance()移出类之外,这样它就不再是成员函数了。您没有什么可断言或约束的,因为您无法判断您的静态成员函数是否在对象上被调用(并且您不能使用相同的参数列表的非静态成员函数重载一个静态成员函数)。要么您可以同时编写Singleton::instance()Singleton::instance().instance(),要么两者都不能。

最简单的就是:

代码语言:javascript
复制
class Singleton {
    // ... 
    friend Singleton& make_singleton();
};

Singleton& make_singleton() {
    static Singleton instance;
    return instance;
}

现在它只是make_singleton().Hello(),没有其他的方法来写它了。这可以通过将其包装在单例类模板工厂中来任意概括:

代码语言:javascript
复制
template <typename T>
struct SingletonFactory
    static T& instance() {
        static T instance;
        return instance;
    }
};

SingletonFactory<Singleton>::instance().Hello(); // ok
SingletonFactory<Singleton>::instance().instance().Hello(); // error
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51597208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档