c++ - 即使使用了...,参数包也不会用“...”扩展
问题描述
我目前正在尝试为我的引擎创建一个事件模板类。
我的事件类有一个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...);
我真的不明白这里的问题。
解决方案
带参数调用函数指针和成员函数指针的语法是不同的。
如果是函数指针(即自由函数),您可能会这样做
f(std::forward<Args>(args)...);
在成员函数指针的情况下,您需要一个对象(或指向对象的指针)来调用成员函数及其参数。
(pointer_to_object->*f)(std::forward<Args>(args)...);
但是,如果您可以访问c++17,只需使用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
}
}
推荐阅读
- javascript - 隐藏一个
- 当点击另一个
- java - Wicket 8 wicket setDefaultModel 与 setDefaultModel 冲突
- gitlab - 将 Jira(云)与 Gitlab(服务器)集成
- sql - 在 SQL 中完成的工单持续时间
- java - 我是否应该测试返回的类型是否与所需的类型一致?(多态性)
- python - opencv python cv2.line 仅适用于某些像素值
- websocket - 无法通过 JMeter 插件连接到 Websocket
- c# - 无法创建 UnitTest 类的实例
- php - 在 laravel 5 中使用联合查询进行手动分页?
- twitter - ISP 如何在不让用户收到证书警告的情况下嗅探和解密 https 流量?