从BOOST或C ++ 14类中删除ACE_Singleton和其他一些Singleton类

时间:2016-09-01 14:02:52

标签: c++ c++11 boost c++14

我们正在从C++03迁移到C++14,并且决定从ACE lib开始。我们主要使用ACE lib来实现Singleton对象和锁。因此,对于锁定,我们可以使用mutex中的C++11/14,但更好的替代ACE_SINGLETON。

1 个答案:

答案 0 :(得分:2)

#include <iostream>

class foo;

foo& get_foo();

class foo
{
    friend foo& get_foo();;
private:
    ~foo () { std::cout << "foo destroyed" << std::endl; }
    foo () { std::cout << "foo constructed" << std::endl; }
    foo(const foo&) = delete;
    foo& operator=(const foo&) = delete;
};

foo&
get_foo()
{
    static foo f;
    return f;
}

int
main()
{
    auto& f = get_foo();
}

如果您使用的是Visual Studio,则需要VS-2015或更高版本。

线程局部静态在C ++ 11和转发中具有线程安全初始化。

<强>更新

template <class T>
class Singleton
{
public:
    static T& getinstance()
    {
        static T t;
        return t;
    }
};

但归根结底,我是KISS的忠实粉丝。没有什么比为单例编写get_foo()工厂函数简单得多(感谢线程安全函数本地静态)。由于语言现在提供了硬件(线程安全初始化),class Singleton<T>几乎没有增加价值。

这是我写的最近的代码,表明我正在练习我所说的话:

https://github.com/HowardHinnant/date/blob/master/tz.cpp#L2881-L2886

在这种特殊情况下,我需要为我的单身人士制作一个非常复杂的构造过程,甚至偶尔重新初始化它的能力。但它仍然归结为一个围绕函数本地静态的工厂函数。