Может ли шаблонный полиморфизм использоваться вместо полиморфизма ОО?

Я пытаюсь разобраться с применением шаблонного программирования (и в будущем - шаблонного метапрограммирования) в реальных сценариях. Одна проблема, которую я обнаружил, состоит в том, что шаблоны C ++ и полиморфизм не всегда играют вместе, как я хочу.

Мой вопрос заключается в том, является ли способ, которым я пытаюсь применить шаблонное программирование, неправильным (и я должен использовать простой старый ООП), или если я все еще застрял в мышлении ООП.

В данном конкретном случае я пытаюсь решить проблему, используя шаблон стратегии. Я продолжаю сталкиваться с проблемой, когда я в конечном итоге хочу, чтобы что-то велось полиморфно, что шаблоны, кажется, не поддерживают.

Код ООП с использованием композиции:

class Interpolator {
   public:
     Interpolator(ICacheStrategy* const c, IDataSource* const d);
     Value GetValue(const double);
}

void main(...) {
    Interpolator* i;
    if(param==1)
       i = new Interpolator(new InMemoryStrategy(...), new TextFileDataSource(...));
    else if(param==2)
       i = new Interpolator(new InMemoryStrategy(...), new OdbcDataSource(...));
    else if(param==3)
       i = new Interpolator(new NoCachingStrategy(...), new RestDataSource(...));

    while(run) {
       double input = WaitForRequest();
       SendRequest( i->GetValue(input));
    }
}

Потенциальная версия шаблона:

class Interpolator<class TCacheStrategy, class TDataSource> {
   public:
     Interpolator();
     Value GetValue(const double);               //may not be the best way but
     void ConfigCache(const& ConfigObject);      //just to illustrate Cache/DS         
     void ConfigDataSource(const& ConfigObject); //need to configured

}

//Possible way of doing main?
void main(...) {
    if(param==1)
       DoIt(Interpolator<InMemoryStrategy,TextFileDataSource>(),c,d);
    else if(param==2)
       DoIt(Interpolator<InMemoryStrategy,OdbcDataSource>(),c,d)
    else if(param==3)
       DoIt(Interpolator<NoCachingStrategy,RestDataSource>(),c,d)

}

template<class T>
void DoIt(const T&  t, ConfigObject c, ConfigObject d) {
   t.ConfigCache(c);
   t.ConfigDataSource(c);
   while(run) {
      double input = WaitForRequest();
      SendRequest( t.GetValue(input));
   }
}

Когда я пытаюсь преобразовать реализацию ООП в реализацию на основе шаблонов, код Интерполатора можно перевести без особых проблем. По сути, замените «интерфейсы»; с параметрами типа шаблона и добавьте механизм для передачи экземпляра Strategy / DataSource или параметров конфигурации.

Но когда я перехожу к «основному», мне неясно, как это должно быть написано, чтобы использовать преимущества шаблонов в стиле шаблонного метапрограммирования. Я часто хочу использовать полиморфизм, но он, похоже, не очень хорошо работает с шаблонами (иногда мне кажется, что мне нужны универсальные шаблоны Java для стирания типов ... тьфу).

Когда я часто нахожу, я хочу сделать что-то вродеTemplateType<?,?> x = new TemplateType<X,Y>() где х не волнует, что X, Y.

На самом деле, это часто моя проблема при использовании шаблонов.

Do I need to apply one more level of templates? Am I trying to use my shiny new power template wrench to install a OOP nail into a PCI slot? Or am I just thinking of this all wrong when it comes to template programming?

[Править] Несколько человек отметили, что на самом деле это не шаблонное метапрограммирование, поэтому я немного перефразировал вопрос. Возможно, это часть проблемы - я еще не понял, что такое TMP.

Ответы на вопрос(3)

Ваш ответ на вопрос