首页 > 解决方案 > 即使使用了...,参数包也不会用“...”扩展

问题描述

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

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

调用事件时,它将使用必要的参数调用添加到向量中的每个函数。

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

目前是这样写的。

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...);

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

标签: c++c++11templatesfunction-pointersfunction-call

解决方案


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

如果是函数指针(即自由函数),您可能会这样做

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

推荐阅读