我们正在从
C++03
迁移到 C++14
,这是从 ACE lib 走的路的决定。我们主要将 ACE 库用于 Singleton 对象和锁。所以对于锁,我们可以使用 mutex
中的 C++11/14
但什么是 ACE_SINGLETON 的更好替代品。
#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
在这种特殊情况下,我需要为我的单例创建一个相当复杂的构造过程,甚至需要偶尔重新初始化它的能力。但它仍然归结为一个工厂函数,包裹着一个函数局部静态。