我不確定我是否正確理解你的問題,但對我來說,單身人士的「集合」是無關緊要的。你有一個固定數量的單例,稱它們爲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標準庫中的功能。
這是不可能的模糊和不明確的 - 甚至不清楚問題是什麼。 – 2012-07-19 08:12:15