Я пытаюсь разобраться в применении шаблонного программирования (и в будущем - шаблонного метапрограммирования) в реальных сценариях. Одна проблема, которую я обнаружил, заключается в том, что шаблоны 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 не волнует, что такое X, Y.
На самом деле, это часто моя проблема при использовании шаблонов.
- Нужно ли применять еще один уровень
шаблоны?
- Я пытаюсь использовать свой новый блестящий гаечный ключ
установить гвоздь ООП в слот PCI?
- Или я просто думаю об этом
неправильно, когда дело доходит до шаблона
программирование?
[Редактировать] Несколько человек отметили, что на самом деле это не шаблонное метапрограммирование, поэтому я немного перефразировал вопрос. Возможно, это часть проблемы - я еще не понял, что такое TMP.