做了一些搜索,但找不到这个问题的答案,如果转载,请见谅。我想在一堆不同的对象上使用相同的参数调用相同的函数。我目前是这样实现的:
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
以外的参数时出错.我还重新排序了您的函数的参数,将包放在最后,以便可以推导出包中的类型。