在回答问题时,我建议使用模板别名来定义成员函数的签名;也就是说,不仅仅是类型定义一个成员函数,而且能够分解出包含该方法的目标类:
template<typename T>
using memberf_pointer = int (T::*)(int, int);
尽管这似乎涵盖了问题的内容,但我尝试将其概括为任意函数参数:
template<typename T, typename... Args>
using memberf_pointer = int (T::*)(Args&&...);
它因参数推导问题而失败(基本上它假定一个空参数列表)。这是一个演示:
#include <iostream>
class foo
{
public:
int g (int x, int y) { return x + y ; }
};
template<typename T, typename...Args>
using memberf_pointer = int (T::*)(Args&&...);
int main()
{
foo f ;
memberf_pointer<foo> mp = &foo::g ;
std::cout << (f.*mp) (5, 8) << std::endl ;
}
为什么是这样?有没有办法让它工作?