Сохраните шаблонные объекты как объекты-члены

предположим, что у вас есть такой код:

struct Manager
{
  template <class T> 
  void doSomething(T const& t)
  {
    Worker<T> worker;
    worker.work(t);
  }
};

Объект «Менеджер» создается один раз и вызывается с несколькими разными типами «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 является затратной по времени операцией, и ее следует избегать, создавая ее N раз (в пределах doSomething ). По соображениям безопасности потоков допустимо иметь одного Worker , одного Worker и Worker для каждого «Manager», но не один работник для всех менеджеров. Так что обычно я делал "worker" переменной-членом. Но как я мог сделать это в приведенном выше коде? (Я не знаю заранее, какие "T" будут использоваться.)

Я нашел решение, использующее std :: map, но оно не полностью типизировано и, конечно, не очень элегантно. Можете ли вы предложить безопасный способ создания Worker чаще, чем один раз на «T» без виртуальных методов?

(обратите внимание, что Worker не является производным от какого-либо базового класса, свободного от шаблонных аргументов) .

Спасибо за любое решение!

10
задан Philipp 28 April 2011 в 18:23
поделиться