2

我想检测一个函数是否(静态)在派生类中被覆盖:

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'。我更喜欢直接回答我的问题。讲述实际问题以确定过载。我还将感谢任何显示解决一般问题的其他方法的答案。

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

4

2 回答 2

1

在这里工作。顺便说一句,最简单的方法是将f()in定义A为空:

struct A{ void func(){ } };
于 2011-09-14T20:56:41.700 回答
0

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

在 wikipedias template metagrogramming entry 上有一些关于它的介绍:

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

不过,它会使您的代码更加复杂,因此我认为您应该考虑重新设计不需要此功能的重新设计-它更多的是反射属性,而 C++ 目前还不是很擅长:(

于 2011-09-14T20:44:32.967 回答