我想检测某个函数是否(静态地)在派生类中被覆盖:
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();
显然,如果没有覆盖,我不会调用'func'。 我更喜欢直接回答我的问题。讲述实际问题以确定超载。 我还要感谢任何能够解决一般问题的方法。
好吧,它编译,我还没有找到我的实际代码的差异,但没有。 顺便说一下,在我的实际代码中,我不只是试图避免调用函数,还有更多。我真的想知道函数是否被覆盖,或者我是否需要使用完全不同的方法。
答案 0 :(得分:1)
作品here。 BTW最简单的方法是将f()
中的A
定义为空:
struct A{ void func(){ } };
答案 1 :(得分:0)
我不知道你要具体做什么的任何方法,但你可以使用一些很酷的模式来使用模板实现“静态多态”。这消除了您在运行时使用v-table的依赖性(实际上,没有一个用于实现类似多态的效果)。因此,您应该能够在编译时检查您需要的功能是否可用。
在wikipedias模板metagrogramming条目上有一点关于它的介绍:
http://en.wikipedia.org/wiki/Template_metaprogramming
它会让你的代码变得更复杂,所以我认为你应该只考虑一个不需要这个功能的重新设计 - 它更多的是一个反射属性而且C ++在这方面还不是很好:(