假設你有一些像這樣的代碼:商店模板對象作爲成員對象
struct Manager
{
template <class T>
void doSomething(T const& t)
{
Worker<T> worker;
worker.work(t);
}
};
「管理員」對象被創建一次,並呼籲有幾個diffent類型爲「T」,但每種類型的T稱爲多倍。這可能是,以簡化的形式,像
Manager manager;
const int N = 1000;
for (int i=0;i<N;i++)
{
manager.doSomething<int>(3);
manager.doSomething<char>('x');
manager.doSomething<float>(3.14);
}
現在仿形揭示構建Worker<T>
是一個耗時的操作,並且應當避免構建了N次(內doSomething<T>
)。由於線程安全的原因,每個「經理」可以有一個Worker<int>
,一個Worker<char>
和Worker<float>
,但所有經理都沒有一個Worker<int>
。所以通常我會讓「worker」成爲一個變量。但是我怎麼能在上面的代碼中做到這一點? (我不知道哪個「T」會被使用)。
我發現了一個使用std :: map的解決方案,但它不完全類型安全,當然也不是很優雅。如果沒有虛擬方法,你可以建議一種類型安全的方法,而不是每構建一個「T」更經常構建Worker<T>
?
(請注意Worker不是從任何模板參數的自由基類派生的)。
感謝您的任何解決方案!
聽起來像一個元組的工作,雖然我不熟悉語法,所以我不能提供一個例子。 – 2011-04-28 18:30:28
如何讓你的工人類每個類只有一個實例? (因爲工作人員,工作人員,或工作人員,...或不同的類,它是可能的) - 工作人員 :: instance_get()。work(t) –
2011-04-28 18:55:38
如果你很高興使用'boost :: mpl',自己的問題和答案,你可能能夠適應你的需求。 http://stackoverflow.com/questions/4798169/is-there-a-way-to-break-out-of-boostmpl-for-each – Nim 2011-04-28 19:27:28