如何实现编译时检查转发在CRTP中是否有效?

sha*_*oth 8 c++ casting crtp static-cast upcasting

我有一个普通的旧CRPT(请不要因访问限制而分心 - 问题与他们无关):

 template<class Derived>
 class Base {
     void MethodToOverride()
     {
        // generic stuff here
     }
     void ProblematicMethod()
     {
         static_cast<Derived*>(this)->MethodToOverride();
     } 
 };
Run Code Online (Sandbox Code Playgroud)

像往常一样打算像这样使用:

 class ConcreteDerived : public Base<ConcreteDerived> {
     void MethodToOverride()
     {
        //custom stuff here, then maybe
        Base::MethodToOverride();
     }
 };
Run Code Online (Sandbox Code Playgroud)

现在static_cast困扰我了.我需要一个向下投射(不是向上投射),所以我必须使用一个明确的演员.在所有合理的情况下,强制转换都是有效的,因为当前对象确实是派生类.

但是如果我以某种方式改变层次结构并且演员现在变得无效呢?

我可以以某种方式强制执行编译时检查,在这种情况下显式向下转换有效吗?

jal*_*alf 5

在编译时,您只能检查静态类型,这就是static_cast已经做的事情.

给定a Base*,它只是,并且只能在运行时知道它的动态类型是什么,即它是否实际指向a ConcreteDerived或其他东西.因此,如果要检查它,必须在运行时完成(例如通过使用dynamic_cast)