方法指针和常量



考虑以下假设示例:

template<typename T, typename R, typename... Ps>
R call(T& t, R (T::*method)(Ps...), Ps... ps){
return (t.*method)(ps...);
}
struct A{
int f(int i) const {return i;}
};
A a;

call(a, &A::f, 3)不会编译,因为f是常量。我可以在不提供以下过载的情况下使call工作吗:

template<typename T, typename R, typename... Ps>
R call(T& t, R (T::*method)(Ps...) const, Ps... ps){
return (t.*method)(ps...);
}

已经有一个标准的库函数允许调用任何可调用的函数,包括成员函数指针。您可以简单地将其用于包装器函数,它将自动允许使用任何类型的可调用函数:

使用C++20:

decltype(auto) call(auto&& f, auto&&... args) {
/* do whatever you want here */
return std::invoke(decltype(f)(f), decltype(args)(args)...);
}

这将作为第一个参数传递成员函数指针,作为第二个参数传递类对象,然后传递成员函数参数。

如果您需要访问类对象,您可以将其拆分,并专门使用成员函数指针调用语法:

decltype(auto) call(auto&& f, auto&& t, auto&&... args)
{
/* do whatever you want with t here */
return (decltype(f)(f).*decltype(t)(t))(decltype(args)(args)...);
}

相关内容

  • 没有找到相关文章

最新更新