c++ - Foreach 等价于可变参数函数

标签 c++ c++11 variadic-functions

<分区>

做了一些搜索,但找不到这个问题的答案,如果转载,请见谅。我想在一堆不同的对象上使用相同的参数调用相同的函数。我目前是这样实现的:

void callWithArg(const char* msg) { }

template <typename HEAD, typename.... TAIL>
void callWithArg(HEAD&& head, TAIL&&... tail, const char* msg) {
    head.foo(msg);
    callWithArg(tail..., msg);
}

显然,这本身并不是一段特别乏味的代码,我只是想知道是否有比这种递归调用更简单或更清晰的迭代该参数包的方法?谢谢!

最佳答案

这是我所知道的最简洁的表达方式:

template<typename ...T>
void callWithArg(const char *msg, T &&...t) {
  int dummy[] = { 0, (t.foo(msg), 0)... };
}

包扩展扩展为 int 类型的表达式列表, 用于初始化数组 dummy (我们扔掉了)。调用foo是有序的,因为在 C++11 中,列表初始化的元素是从左到右排序的。

如果你添加一个#include <initializer_list> ,您可以将其稍微简化为:

auto dummy = { 0, (t.foo(msg), 0)... };

您可能还想抑制各种编译器在此代码上产生的“未使用变量”警告,使用

(void) dummy;

初始0,包含在内是为了避免在函数没有给出除 msg 以外的参数时出错.我还重新排序了您的函数的参数,将包放在最后,以便可以推导出包中的类型。

关于c++ - Foreach 等价于可变参数函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14857926/

相关文章:

c++ - 在 vector 构造函数中从 initializer_list<const char*> 转换为 initializer_list<string>

c++ - 对数组值的 static_assert

c++ - 使用可变参数函数的初始化列表

erlang - 如何在 Erlang 中创建可变数量的函数?

c++ - 为什么没有对成员函数指针的隐式转换

c++ - LLVM万花筒教程JIT编译问题

c++ - 指向派生对象数组的基指针

c++ - 如何在 C++ 中仅包含头文件中的一个符号

c++ - 在C++中递归地从十进制到八进制。以std::string格式输出

c++ - 为可变参数打包数组