我有两节课:

class A {
   public:
      bool funA();
};
class B : public A {
   pubic:
      bool funB();
};


以及带有函数指针的模板化函数,然后针对B的列表对其进行调用:

template <typename T>
std::vector<T> getFunc(T (B::func*)()) {
 ....iterator through list of B's calling func....
}


如果我尝试调用getFunc(B::funA),则会收到“不存在getFunc(A :: funA)...”的编译错误。

我可以通过简单地创建另一个使用getFunc而不是B ::的A::func*来解决该问题,但是现在我有两个功能完全相同。有没有办法让我仅以getFunc的一个实现结束?

编辑:我需要一个预C ++ 11解决方案。

最佳答案

简单地推导整个参数并提取其返回类型:

template<class F,class R=std::result_of_t<F(B&)>>
std::vector<R> getFunc(F&&){return{};}


std::result_of_t是C ++ 14,对于C ++ 11兼容解决方案,请使用typename std::result_of<F(B&)>::type

对于C ++ 03解决方案,只需推断类类型:

template <typename T, typename C>
std::vector<T> getFunc(T (C::*func)());

10-05 22:45