Примечание: Следующий вопрос касается Template Method Design Pattern и C++ функций шаблонов. Чтобы отличить оба, я буду использовать курсивом при обращении к шаблону проектирования и bold при обращении к шаблонам C++.Внедрение шаблонного метода шаблона
Идея шаблона метода шаблона заключается в том, чтобы сделать части сменного алгоритма. Обычно это достигается путем наследования, когда подкласс предоставляет конкретные реализации, которые подключены к алгоритму базового класса. Однако, если методы крючка должны быть шаблоны, это не сработает шаблоны не может быть виртуальным. Вот простой пример, который не компилируется:
class Base
{
public:
// This is the template method
template <typename T>
void doSomething(T input)
{
//...
auto converted = ConvertInput(input);
//...
std::cout << converted;
}
protected:
//compile error "member function templates cannot be virtual"
template <typename T>
virtual T ConvertInput(T input) = 0;
};
class Derived : public Base
{
protected:
template <typename T>
T ConvertInput(T input)
{
return 2 * input;
}
};
int main()
{
Derived d;
d.doSomething(3);
}
Есть ли способ для реализации методов шаблонов, которые используют шаблон функции крюков?
Я не заинтересован в использовании класса Base
как типа в любом месте. Я всегда буду использовать конкретный конкретный тип для достижения максимальной оптимизации времени компиляции. Итак, другая формулировка этого вопроса: Как я могу создать несколько классов Derived-1 .. Derived-n
, которые имеют шаблоны функций, которые совместно используют общий скелет кода через реализации?
[CRTP] (https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern). Сделайте 'Base' взять' Derived' в качестве параметра шаблона. Вызов 'ConvertInput' через' static_cast (this) -> ConvertInput' –
Есть ли ограничение на набор типов, используемых для 'T'? – Yakk
@Yakk Да, но только неявные. Например. одному экземпляру этого нужно брать итераторы, что может быть чем угодно. –