假设你有一些像这样的代码:商店模板对象作为成员对象
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