如何在编译或运行时检测非虚拟覆盖

时间:2011-09-14 20:36:11

标签: 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<C>::func != &C::func)
  c.func();

显然,如果没有覆盖,我不会调用'func'。 我更喜欢直接回答我的问题。讲述实际问题以确定超载。 我还要感谢任何能够解决一般问题的方法。

好吧,它编译,我还没有找到我的实际代码的差异,但没有。 顺便说一下,在我的实际代码中,我不只是试图避免调用函数,还有更多。我真的想知道函数是否被覆盖,或者我是否需要使用完全不同的方法。

2 个答案:

答案 0 :(得分:1)

作品here。 BTW最简单的方法是将f()中的A定义为空:

struct A{ void func(){ } };

答案 1 :(得分:0)

我不知道你要具体做什么的任何方法,但你可以使用一些很酷的模式来使用模板实现“静态多态”。这消除了您在运行时使用v-table的依赖性(实际上,没有一个用于实现类似多态的效果)。因此,您应该能够在编译时检查您需要的功能是否可用。

在wikipedias模板metagrogramming条目上有一点关于它的介绍:

http://en.wikipedia.org/wiki/Template_metaprogramming

它会让你的代码变得更复杂,所以我认为你应该只考虑一个不需要这个功能的重新设计 - 它更多的是一个反射属性而且C ++在这方面还不是很好:(