Foo
CRTP を使用して親クラスからテンプレート メソッドを継承するクラスがあり、文字通り数十の個別のメンバー メソッドを提供する必要がありません。このようなもの:
class Foo : public SomeBarClass<Foo>
{
//..
//from SomeBarClass
public:
template <class T> void onMsg(T* msg);
private:
IFoxMod* foxMod_;
};
の実装ではonMsg
、次のようなものが必要です。
template <class T>
void Foo::onMsg(T* msg)
{
if (foxMod_->shouldDoStuff(msg))
{
//do stuff
}
}
また、メソッドを提供する共通のインターフェースに準拠している限り、多くのタイプが存在する可能性がありfoxMod_
ます (構成ファイルで指定された名前でコンストラクターでインスタンス化されたもののうちの 1 つ) 。問題は、これが次の定義につながることです。Foo
bool shouldDoStuff
struct IFoxMod
{
virtual ~IFoxMod() {}
template <class T> shouldDoStuff(T* msg) = 0;
};
FoxMods
実装するすべてのclass redMountainLogic : public IFoxMod
場合(たとえば、物事を行うのが適切な場合は、独自の識別方法がある場合があります)。
ただし、仮想テンプレートを使用できないため、これは違法であり、回避策を見つけようとしています。基本的に動的ディスパッチが必要ですが、渡す引数はテンプレートです。回避策が思いつきません。