私は単純な古い CRPT を持っています (アクセス制限に気を取られないでください - 問題はそれらについてではありません):
template<class Derived>
class Base {
void MethodToOverride()
{
// generic stuff here
}
void ProblematicMethod()
{
static_cast<Derived*>(this)->MethodToOverride();
}
};
これは通常、次のように使用することを目的としています。
class ConcreteDerived : public Base<ConcreteDerived> {
void MethodToOverride()
{
//custom stuff here, then maybe
Base::MethodToOverride();
}
};
今それは私をstatic_cast
悩ませます。(アップキャストではなく) ダウンキャストが必要なので、明示的なキャストを使用する必要があります。現在のオブジェクトが実際に派生クラスであるため、妥当なすべてのケースでキャストは有効です。
しかし、どうにかして階層を変更し、キャストが無効になったらどうしますか?
この場合、明示的なダウンキャストが有効であることをコンパイル時にチェックすることはできますか?