注: 次の質問は、テンプレート メソッド デザイン パターンとC++ 関数テンプレートに関するものです。両方を区別するために、デザイン パターンを参照するときは斜体を使用し、C++ テンプレートを参照するときは太字を使用します。
テンプレート メソッド パターンのアイデアは、アルゴリズムの一部を交換可能にすることです。これは通常、サブクラスが基本クラスのアルゴリズムにプラグインされる具体的な実装を提供する継承によって実現されます。ただし、フック メソッドをtemplatesにする必要がある場合、テンプレートを仮想にすることはできないため、これは機能しません。コンパイルされない簡単な例を次に示します。
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を持つ複数のクラスを作成するにはどうすればよいでしょうか?