C++ 参数包未扩展为'';尽管使用
我当前正在尝试为我的引擎创建一个事件模板类 我的事件类有一个C++ 参数包未扩展为'';尽管使用,c++,c++11,templates,function-pointers,function-call,c++17,C++,C++11,Templates,Function Pointers,Function Call,C++17,我当前正在尝试为我的引擎创建一个事件模板类 我的事件类有一个std::vector,其中T将被定义为指向需要事件的函数的指针 调用事件时,它将调用添加到向量中的每个函数,其中包含必要的参数 (pointer_to_object->*f)(std::forward<Args>(args)...); 问题是当试图编译这部分代码以调用事件时 现在是这样写的 template <typename... Args> void Call(Args ... args) {
std::vector
,其中T
将被定义为指向需要事件的函数的指针
调用事件时,它将调用添加到向量中的每个函数,其中包含必要的参数
(pointer_to_object->*f)(std::forward<Args>(args)...);
问题是当试图编译这部分代码以调用事件时
现在是这样写的
template <typename... Args>
void Call(Args ... args)
{
for (T f : functions)
{
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)...);
为什么不
f(args…
->*
用于成员函数指针。它最初是这样编写的,但它给了我以下错误:include/event.h:71:14:错误:必须使用“*”或“->*”调用指向“f(…)”中成员函数的指针,例如,(…->*f)(…)”f(args;T
是函数指针还是成员函数指针?这两个不同。消息告诉您将->*
放在f
的左侧。它应该类似于(object_ptr->*f)(args代码>或(object.*f)(args…)代码>我很遗憾我现在无法访问C++ 17,如果它能帮助我,我会尝试改变它,但是我现在用C++ 11AY写的,你说的对,我的问题是误读。然而,我还有另一个问题:如果调用函数的对象已经给出了指向函数的指针,为什么它还需要它?我会尝试更好地解释自己:当我创建我的事件时,我会这样创建:typedef void(Actor::*Collision)(std::shared\u ptr other\u collister);事件碰撞;然后我将向事件添加一个侦听器,如下所示:BoxCollider->OnCollision.AddListener(this->OnCollision);我很抱歉问这个愚蠢的问题,对这一部分来说有点陌生,你再说一遍是什么意思?哪里成员函数有一个隐藏的此
参数,需要使用特殊语法提供。@MassimoIsonni首先:答案是否帮助您解决了当前问题?如果是,你可以。第二:“但是我还有一个问题:”这意味着,你。顺便说一句,你写的评论无助于理解你的问题
(pointer_to_object->*f)(std::forward<Args>(args)...);
#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
}
}