如何使用可变参数进行函数调用?让它看起来像这样:
if (f(args...))复制示例:
template <class callable, class... arguments>
void timer(callable&& f, arguments&&... args )
{
f(args...);
}
class Client
{
public:
void receive(int, int)
{
}
void sub(int x, int y)
{
timer(&Client::receive, this, x, y);
}
};
int main()
{
Client cl;
cl.sub(1,2);
}main.cpp:4:6: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘f (...)’, e.g. ‘(... ->* f) (...)’
4 | f(args...);
| ~^~~~~~~~~发布于 2022-08-30 18:01:44
您可以使用std::invoke(f, args...);而不是f(args...).¹
老实说,我很少使用指向成员函数的指针,但在优先选择上,我看到对于指向类C的一元成员函数f的指针,作为类C的对象的c,调用语法应该是(c.*p)(x),而不是this/c的参数x。
这意味着,如果不想使用std::invoke,就必须提取args...的第一个元素和其余元素,并以如下方式传递它们:(first_of_args.*f)(rest_of_args...)。虽然检索first_of_args相对容易(std::get<0>(std::forward_as_tuple(args...));),但是获得pack rest_of_args需要一些元编程技巧,所以我认为std::invoke只是最好的解决方案。(问题因不能传递some_obj_ptr->*some_pointer_to_member_fun而加剧,但您必须立即应用它。如果不是这样的话,您可以考虑使用std::forward_as_tuple(args...)的第一个元素构建一个std::forward_as_tuple(args...),然后使用std::apply将它们全部传递给first_of_args->*f。)
实际上,我刚刚想到了一个想法:使用一个通用的变量lambda来在first和rest...中构造first和rest...,以便能够满足成员函数指针调用语法。在代码中,您将使用以下内容更改不工作的f(args...)
[&f](auto first, auto... rest){
return (first->*f)(rest...);
}(args...);但这是直接或间接的,std::invoke会为你做什么。
正如评论中所强调的那样,您宁愿完美地转发这些args:
std::invoke(std::forward<callable>(f), std::forward<arguments>(args)...);https://stackoverflow.com/questions/73546146
复制相似问题