参数包未使用“...”扩展,即使使用了...
Parameters pack not expanded with '...' even though ... is used
我目前正在尝试为我的引擎创建事件模板class。
我的事件 class 有一个 std::vector<T>
,其中 T
将被定义为 指向需要事件的函数 的指针.
调用事件时,它将使用必要的参数调用添加到向量中的每个函数。
问题出在尝试编译这部分代码以调用事件时。
目前是这样写的
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)...);
但是,如果您可以访问 c++17, just use 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
}
}
我目前正在尝试为我的引擎创建事件模板class。
我的事件 class 有一个 std::vector<T>
,其中 T
将被定义为 指向需要事件的函数 的指针.
调用事件时,它将使用必要的参数调用添加到向量中的每个函数。
问题出在尝试编译这部分代码以调用事件时。
目前是这样写的
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)...);
但是,如果您可以访问 c++17, just use 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
}
}