我有两节课:
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)());