首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过可变的参数数调用函数

如何通过可变的参数数调用函数
EN

Stack Overflow用户
提问于 2022-08-30 17:04:10
回答 1查看 80关注 0票数 -2

如何使用可变参数进行函数调用?让它看起来像这样:

代码语言:javascript
复制
 if (f(args...))

复制示例:

代码语言:javascript
复制
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);
}
代码语言:javascript
复制
main.cpp:4:6: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘f (...)’, e.g. ‘(... ->* f) (...)’
    4 |     f(args...);
      |     ~^~~~~~~~~
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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来在firstrest...中构造firstrest...,以便能够满足成员函数指针调用语法。在代码中,您将使用以下内容更改不工作的f(args...)

代码语言:javascript
复制
    [&f](auto first, auto... rest){
        return (first->*f)(rest...);
    }(args...);

但这是直接或间接的,std::invoke会为你做什么。

正如评论中所强调的那样,您宁愿完美地转发这些args:

代码语言:javascript
复制
std::invoke(std::forward<callable>(f), std::forward<arguments>(args)...);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73546146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档