仮想関数でなければならないテンプレート関数の回避策に関する質問は、私の問題に役立つ何かを見つけることができませんでしたが、ここではかなり一般的です。need a virtual template member workaroundテンプレート戻り値の回避策を使用した仮想テンプレート関数
提案されたアプローチは、タイプ消去を使用して、きれいで簡単な解決策を導く。しかし、visit()
メソッドから値を返す必要がある場合はどうすればよいですか? OPはすでに彼の質問でこの側面を持っていましたが、彼は決してその結果を使用しなかったので、解決策では無視されました。我々はまだaccept()
も型消去のトリックを適用した後、テンプレート化する必要が
template <typename T>
class BaseVisitor {
public:
BaseVisitor();
T visit(BaseVisited *visited);
virtual ~BaseVisitor();
}
class BaseVisited {
BaseVisited();
template <typename T>
virtual T accept(BaseVisitor<T> *visitor) { return visitor->visit(this); };
virtual ~BaseVisited();
}
:
は今、代わりにこのコードを想像してみてください。その他のアイデアは?
注:Tは任意の基底型(int、stringなど)を表すことができるので、SOの答えのいくつかで示唆されているように、戻り値には基本クラスを使用できません。あなたは基本的に2つの選択肢があり
あなたがクローズ型システム(例えば、 'のstd ::バリアント<>')と型消去(例えば、 '後押し:: any'、'ボイド大丈夫じゃない場合* ')、おそらく唯一の選択は' return T;の代わりに 'T(...);をスローすることです。 – lorro