Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 参数包未扩展为'';尽管使用_C++_C++11_Templates_Function Pointers_Function Call_C++17 - Fatal编程技术网

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
   }
}