gpt4 book ai didi

c++ - 即使使用…,也不用 '…'扩展参数包

转载 作者:行者123 更新时间:2023-12-01 14:43:44 25 4
gpt4 key购买 nike

我目前正在尝试为引擎创建事件模板类。

我的事件类有一个std::vector<T>,其中T将被定义为指向需要该事件的函数的指针。

调用事件时,它将调用带有必需参数的添加到 vector 的每个函数。

问题是当尝试编译代码的这一部分以调用事件时。

目前,它是这样写的。

template <typename... Args>
void Call(Args ... args)
{
for (T f : functions)
{
f->*(args...);
}
}

请注意,我已经尝试过:
f->*((args), ...);
f->*(std::forward(args)...);
f->*(args)...;

和许多其他类似的解决方案。

每当我尝试编译代码时,我都会遇到:
include/event.h:71:22: error: expected ‘)’ before ‘...’ token
f->*(args...);
^
include/event.h:71:26: error: parameter packs not expanded with ‘...’:
f->*(args...);

我真的不明白这里的问题。

最佳答案

用参数调用函数指针和成员函数指针的语法是不同的。

如果是函数指针(即自由函数),则可以

f(std::forward<Args>(args)...);

对于成员函数指针,您需要一个对象(或指向对象的指针)来调用其成员函数及其参数。
(pointer_to_object->*f)(std::forward<Args>(args)...);

但是,如果可以访问 ,只需使用 std::invoke 即可,它具有适合处理上述情况的重载。
#include <utility>    // std::forward
#include <functional> // std::invoke

template <typename... Args>
void Call(Args&& ... args)
// ^^^^^^^^^^^^^^ --> also forwarding reference here
{
for (T f : functions)
{
std::invoke(f, std::forward<Args>(args)...); // like this
}
}

关于c++ - 即使使用…,也不用 '…'扩展参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59561318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com