предположим, что у вас есть такой код:
struct Manager
{
template <class T>
void doSomething(T const& t)
{
Worker<T> worker;
worker.work(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>
для всех менеджеров. Поэтому обычно я делаю "рабочим" переменную-член. Но как я могу сделать это в коде выше? (Я не знаю заранее, какие "T" будут использоваться).
Я нашел решение, использующее std:: map, но он не является полностью типичным и, конечно, не очень элегантным. Можете ли вы предложить типичный способ, не создавая Worker<T>
чаще одного раза за "Т" без виртуальных методов?
(обратите внимание, что Worker не является производным от любого базового класса шаблона-аргумента).
Спасибо за любое решение!