Foreach等效于可变函数

时间:2013-02-13 16:14:49

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

进行了一些搜索并找不到这个问题的答案,所以如果重新发布,请道歉。我想在一堆不同的对象上使用相同的arg调用相同的函数。我目前实现如下:

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

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

1 个答案:

答案 0 :(得分:0)

以下是我所知道的最简洁的方式:

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以避免错误。我还重新排序了函数的参数以将包装放在最后,这样就可以推断出包装中的类型。