これが私の問題の抽象化です。
こういうものを開発したい。
class Base {
}
template<typename T>
class TypedBase : Base {
f(const T& input);
}
ここで、基本ポインタを介してクラス TypedBase の「ファミリ」にアクセスし、f を呼び出したいと考えています。
このようなもの
Base* base_ptr;
if (condition) {
base_ptr = new TypedBase<double>();
} else {
base_ptr = new TypedBase<int>();
}
// Int and double are just examples to get the idea
// Then I Want to call
base_ptr->f(4);
これはコンパイルされません。
空の仮想関数 f() を base に追加しようとしましたが、実行時に vtable が正しい f() と f(T& input) の呼び出しを処理することを期待していましたが、次のように機能しませんでした。
class Base {
virtual f() = 0;
}
では、どうやってそれを行うのですか?一般に、ファミリへのジェネリック ポインターを介して f(...) を呼び出すことができるジェネリック TypedBase へのポインターが必要です。何かご意見は?
もちろん、私はこれを行うことができます:
class Base {
// Repeat for every typename
virtual f(int& x) = 0;
virtual f(double& x) = 0;
}
そして、各 TypedBase はそれらの 1 つだけを実装するため、コードで動的チェックを行うことなく、実行時に型の安全性を確保できます。ただし、呼び出す関数が N 個あり、操作する型が M 個ある場合は、M*N 個の抽象関数を Base クラスに追加する必要があります。より良い解決策はありますか?