C++ 如何在编译或运行时检测非虚拟重写

C++ 如何在编译或运行时检测非虚拟重写,c++,crtp,C++,Crtp,我想检测函数是否在派生类中被(静态)重写: template< typename T > struct A{ void func(){ static_cast<T*>(this)->func(); } }; struct B: A<B>{}; struct C: A<C>{ void func(){ std::cout << "class C" << std::endl; }; C c; if(&A<

我想检测函数是否在派生类中被(静态)重写:

template< typename T >
struct A{ void func(){ static_cast<T*>(this)->func(); } };
struct B: A<B>{};
struct C: A<C>{ void func(){  std::cout << "class C" << std::endl;  };

C c;
if(&A<C>::func != &C::func)
  c.func();
模板
结构A{void func(){static_cast(this)->func();};
结构B:A{};

struct C:A{void func(){std::cout我不知道有什么方法可以满足您的具体要求,但是您可以使用一些很酷的模式来使用模板实现“静态多态性”。这消除了您在运行时对使用v-table的依赖性(实际上,没有一种方法可以实现类似多态性的效果)。因此,您应该能够在编译时检查所需的函数是否可用

wikipedias模板元语法条目中有一个介绍:

<>这将使代码更复杂,所以我认为你应该只考虑一个不需要这个特性的重新设计——它更多的是反射属性,C++还不是很好的:(

Works.BTW最简单的方法是在<代码> < <代码> >空:< /p>定义<代码> f>(代码)>
struct A{ void func(){ } };

这听起来很像SFINAE的工作原理。你的代码没有意义:
a
是一个模板,但在第2行下面,你会像使用非模板一样使用它。好吧,如果你修复了所有的编译器错误,这个指针比较似乎是有效的。那么?事实上,你有权认为它在修复打字错误后有效。我不知道为什么我的实际代码没有。但是空的“f”unc对我来说毫无意义。在维基百科上查找CRTP,这就是我要做的。大致上。也许编译器有一个bug。它不能与其他版本的gcc一起工作。