可变参数模板中每个打包参数的执行函数
Executing function for each packed parameter in variadic template
我在开源项目FeatherKit中注意到了以下行:
int _[] = { (SubscribeToType<MessageTypes>( bus, receiver, desubscribers, unsubscribe ), 0)... };
具有以下上下文:
template<class... MessageTypes>
void Subscribe( MessageBus& bus, MessageReceiver<MessageTypes...>& receiver, bool unsubscribe ) {
std::vector<std::function<void()>> desubscribers;
int _[] = { (SubscribeToType<MessageTypes>( bus, receiver, desubscribers, unsubscribe ), 0)... };
(void) _;
receiver.desubscribers = desubscribers;
}
它显然是为可变参数模板中的每个参数执行函数 SubscribeToType。
我的问题是双重的:
这条生产线究竟是如何工作的?为什么参数解包允许该函数为可变参数模板中的每个参数执行?
我非常确定这条线可以用 lambda 代替。如何将该行替换为 lambda 表达式?
我已经联系了FeatherKit的原作者,但他当时无法回答我的问题。
参数包
- 这条生产线究竟是如何工作的?为什么参数解包允许该函数为可变参数模板中的每个参数执行?
扩展是涉及参数包后跟...
的某种模式
因此expr(T)...
是以expr(T)
为模式的包扩展,它针对参数包中的每个Ti
扩展到expr(T0), expr(T1), expr(T2), ..., expr(TN)
。
包扩展只能在某些上下文中使用,例如参数列表或初始值设定项列表,因此在这种情况下,每个子表达式的结果都用于形成数组int _[]
的初始值设定项列表。数组未使用,仅存在,以便其初始值设定项可用作执行包扩展的上下文。 每个子表达式的格式都是(SubscribeToType<Ti>(blah, blah), 0)
这意味着函数调用的结果将被丢弃,表达式的值为 0。这有点麻烦,允许包扩展生成包含 N 个整数的大括号 init-list,因为这是初始化数组所需的。
- 我非常确定这条线可以用 lambda 代替。如何将该行替换为 lambda 表达式?
你为什么要这样做?
它可以,但你需要在lambda中进行非常相似的包扩展,所以它不会简化任何东西。
相关文章:
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 如何将带有参数的愚蠢函数添加到愚蠢的执行器中?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 是否可以在命令行中将输入参数传递给可执行文件
- 是否可以将具有不同签名的 lambda 存储在 std::vector 中并在函数中执行它们(使用各自的参数)?
- 如何将带有参数的方法传递给线程以执行?
- 运算符 new 的执行顺序和构造函数的参数
- 使用参数包自动执行dynamic_cast检查
- 执行参数未提供预期结果
- 如何查看完整的CMD执行命令,包括参数和标志?
- 命令行参数执行C 程序
- 在v8中,使用cpp对象作为参数执行js函数
- 对重载运算符参数执行隐式转换时出现编译器错误
- 如何使C++函数使用双精度参数或无参数执行
- 打开一个通过命令参数执行某些操作的函数
- 如何检查 chaiscript 中是否定义了函数以及如何使用类型化参数执行它
- 使用一个参数执行?为什么
- 基于运行时参数执行整型模板函数
- 使用c++将音频从mp4提取为mp3(不使用参数执行ffmpeg)
- Dll注射.使用参数执行CreateRemoteThread