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

问题描述 投票:0回答:1

我们正在从

C++03
迁移到
C++14
,这是从 ACE lib 走的路的决定。我们主要将 ACE 库用于 Singleton 对象和锁。所以对于锁,我们可以使用
mutex
中的
C++11/14
但什么是 ACE_SINGLETON 的更好替代品。

c++ c++11 boost c++14
1个回答
3
投票
#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/src/tz.cpp#L573-L578

在这种特殊情况下,我需要为我的单例创建一个相当复杂的构造过程,甚至需要偶尔重新初始化它的能力。但它仍然归结为一个工厂函数,包裹着一个函数局部静态。

© www.soinside.com 2019 - 2024. All rights reserved.