3

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

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

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

4

1 回答 1

0

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

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

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

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

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

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

(void) dummy;

如果函数没有给出除 以外的参数,则包含初始0,值以避免错误msg。我还重新排序了您的函数参数以将包放在最后,以便可以推断包中的类型。

于 2013-02-15T23:42:50.987 回答