Может ли шаблонный полиморфизм использоваться вместо полиморфизма ОО?
Я пытаюсь разобраться с применением шаблонного программирования (и в будущем - шаблонного метапрограммирования) в реальных сценариях. Одна проблема, которую я обнаружил, состоит в том, что шаблоны 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.