Я пытаюсь придумать шаблонное программирование (и в какой-то момент, метапрограммирование шаблонов) для реальных сценариев. Одна из проблем, которую я нахожу, заключается в том, что шаблоны С++ и полиморфизм не всегда играют вместе так, как я хочу.
Мой вопрос в том, что способ, которым я пытаюсь применить шаблонное программирование, является неправильным (и я должен использовать простой старый ООП), или если я все еще придерживаюсь мышления ООП.
В этом конкретном случае я пытаюсь решить проблему, используя шаблон стратегии. Я продолжаю сталкиваться с проблемой, когда в конечном итоге я хочу, чтобы что-то по-политически выглядело, какие шаблоны, похоже, не поддерживают.
Код ООП с использованием композиции:
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));
}
}
Когда я пытаюсь преобразовать реализацию ООП в реализацию на основе шаблонов, код Interpolator можно перевести без большой боли. В основном замените "интерфейсы" параметрами типа шаблона и добавьте механизм, чтобы либо пройти в экземпляре Strategy/DataSource, либо параметры конфигурации.
Но когда я перехожу к "основному", мне не ясно, как это должно быть написано, чтобы использовать шаблоны в стиле мета-программирования шаблона. Я часто хочу использовать полиморфизм, но он, похоже, не очень хорошо работает с шаблонами (иногда мне кажется, что мне нужны стили для генерации стилей Java... ugh).
Когда я часто нахожу, что хочу сделать, есть что-то вроде TemplateType<?,?> x = new TemplateType<X,Y>()
, где x не заботится о том, что X, Y есть.
На самом деле, это часто бывает проблемой при использовании шаблонов.
- Нужно ли мне применять еще один уровень шаблоны?
- Я пытаюсь использовать свой блестящий новый ключ для силового шаблона установить гвоздь OOP в слот PCI?
- Или я просто думаю об этом все неправильно, когда дело касается шаблона программирование?
[Edit] Несколько человек указали, что это не метапрограммирование шаблона, поэтому я немного изменил вопрос. Возможно, эта часть проблемы - я еще не знаю, что такое TMP.