我不确定我是否正确理解了你的问题,但对我来说,单例的“集合”是无关紧要的。您有固定数量的单例,将它们调用Singleton1
到编译时已知的位置SingletonX
。X
线程并不重要。
对于实际的单例,您可以让它们从处理每个线程部分的单个模板化基类继承。像这样的东西:
template<class B>
struct SingletonBase
{
static B &getInstance()
{
// One instance per thread
static std::unordered_map<std::thread::id, B> intances;
if (instances.find(std::this_thread::get_id()) == instances.end())
instances[std::this_thread::get_id()] = B{};
return instances[std::this_thread::get_id()];
}
};
class Singleton1 : public SingletonBase<Singleton1>
{
// ...
};
如果您不希望为单例提供不同的不同类,则可以使用std::array
它们来存储它们:
class Singleton : public SingletonBase<Singleton>
{
// ...
};
std::array<Singleton, X> singletons;
这将在编译时创建一个指定数量的数组X
,并且可以像普通数组一样访问Singleton &instance = singletons[0].getInstance();
:
请注意,我的示例代码使用“新”C++11 标准库中的功能。