2013-09-23 4 views
0

У меня есть класс шаблонов с целочисленным параметром, но я знаю только параметр шаблона во время выполнения. Есть ли какая-либо лучшая практика для создания классов шаблонов во время выполнения?Создание динамического шаблона C++

Решение, которое я разработал, состоит в создании абстрактного базового класса класса шаблонов, который предоставляет интерфейс и имеет класс адаптера, который создает класс шаблона и сохраняет его в указателе типа базовый класс.

class MyInterface { 
    virtual void doSomething(...) = 0; 
} 

template <int T> 
class MyTemplateClass : public MyInterface { 
    void doSomething(...) { ... }; 
} 

class TemplateAdapter { 
    MyInterface* template_class; 

    Template(int n) { 
     switch(n) { 
      case 1: 
      template_class = new MyTemplateClass<1>(); 
      break; 
      case 2: 
      template_class = new MyTemplateClass<2>(); 
      break; 
      case 3: 
      template_class = new MyTemplateClass<3>(); 
      break; 
      [...] 
     } 
    } 

    void doSomething() { 
     template_class->doSomething(); 
    } 
} 

Теперь, когда это действительно работает и дает правильные результаты, это очень медленно. Это почти вдвое медленнее, чем использование класса шаблона. Понятно, что это должно быть несколько медленнее, но это намного медленнее, чем я ожидал.

Откуда эта большая потеря производительности? И знаете ли вы, как динамически создавать класс шаблонов с лучшей производительностью?

Любая помощь очень ценится! Спасибо, Pedro

+2

Шаблоны! = Время выполнения. Вы используете неправильный инструмент для этой работы. – EJP

+0

Надеюсь, вы используете 'unique_ptr' или аналогичный код в реальном коде :) –

+0

Как написано, его трудно подкрепить, так как все, что было бы трудоемким, в коде, вы легко опускаете. Почему вы делаете это с помощью шаблонов в первую очередь? Шаблоны не подходят для этого, и утверждение «Я знаю только параметр шаблона во время выполнения» является хорошим показателем этого. – WhozCraig

ответ

0

Такая конструкция не позволяет компилятору встраивать что-либо (виртуальный вызов может быть удалено, если фактический тип известен во время компиляции), и требует принятия решения во время выполнения для класса, который фактически реализованный ,

0

Шаблон в C++ существует только во время компиляции, любая попытка динамического создания шаблона по этой причине не удалась.

Ваш код может быть оптимизирован путем удаления переключателя во время выполнения и создания адаптера шаблона:

template<int i> 
class TemplateAdapter { 
    MyTemplateClass<i> template_class; 

} 

, но это исключает необходимость адаптера.

0

Другие ответы уже объясняют, что шаблоны - это время компиляции, а не функция времени исполнения. Однако в вашем вопросе спрашивается, почему в вашем обходном пути существует такое значительное снижение производительности. Если вы часто создаете класс адаптера, новое ключевое слово выделяет память из кучи для дочернего объекта, а выделение кучи заведомо медленное.

0

Вам нужна инверсия зависимостей, введенная MyInterface? Если нет, почему бы просто не создать неполиморфный и нетемплицированный тип, который делает то же самое, что и ваш адаптер, но содержит полную реализацию требуемой функциональности ...? Он будет решать, что делать на основе целочисленного параметра, переданного во время построения, без создания нового объекта или вызова виртуальных функций ...

Смежные вопросы