注意:以下问题是关于模板方法设计模式和C++ 函数模板的。为了区分两者,我将在提及设计模式时使用斜体,在提及 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
具有跨实现共享公共代码框架的函数模板的类?