我们正在从C++03
迁移到C++14
,并且决定从ACE lib开始。我们主要使用ACE lib来实现Singleton对象和锁。因此,对于锁定,我们可以使用mutex
中的C++11/14
,但更好的替代ACE_SINGLETON。
答案 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
在这种特殊情况下,我需要为我的单身人士制作一个非常复杂的构造过程,甚至偶尔重新初始化它的能力。但它仍然归结为一个围绕函数本地静态的工厂函数。