可变参数函数的 Foreach 等价物

Bar*_*rry 6 c++ variadic-functions c++11

做了一些搜索,找不到这个问题的答案,所以如果重新发布,我们深表歉意。我想在一堆不同的对象上使用相同的参数调用相同的函数。我目前是这样实现的:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*ith 2

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

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

pack 扩展扩展为 类型的表达式列表int,这些表达式用于初始化数组dummy(我们将其丢弃)。对 的调用foo是按顺序排列的,因为在 C++11 中,列表初始化的元素是从左到右排序的。

如果添加#include <initializer_list>,则可以稍微简化为:

auto dummy = { 0, (t.foo(msg), 0)... };
Run Code Online (Sandbox Code Playgroud)

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

(void) dummy;
Run Code Online (Sandbox Code Playgroud)

包含首字母0,是为了避免在函数除了 之外没有给出任何参数的情况下出现错误msg。我还重新排序了函数的参数,将包放在最后,以便可以推断出包中的类型。