我有一个参数包,其中包含默认的可构造对象和可调用对象(如 ExampleFunctor
),我想按顺序(从左到右)调用所有这些对象。如果返回类型是除 void 之外的任何类型,我可以使用初始化列表来执行此操作:
struct ExampleFunctor{
void operator()(){someGlobal = 4;}
};
template<typename... Ts>
struct CallThem {
void operator()(){
auto list = {Ts()()...};
}
}
但是,如果返回类型为 void,则此技巧无效。
我可以将所有 T 包装在一个返回 int 的包装器中,但这似乎有些过分,而且这段代码最终将在具有 32K 闪存的 cortex M3 上运行,因此如果我编译 Debug模式下的单元(在 Release模式下调试让我的大脑受伤)。
有没有更好的办法?
最佳答案
使用逗号运算符:
int someGlobal;
struct ExampleFunctor{
void operator()(){someGlobal = 4;}
};
template<typename... Ts>
struct CallThem {
void operator()(){
int list[] = {(Ts()(),0)...};
(void)list;
}
};
int main()
{
CallThem<ExampleFunctor, ExampleFunctor>{}();
}
顺便说一句,我在这里没有使用initializer_list
,而只是一个数组;自己尝试哪一个/如果其中任何一个可以被编译器丢弃。 (void)list
用于抑制警告(未使用的变量)。
关于c++ - 如果函数返回类型为 void,我应该如何调用可变参数包中的所有函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19860851/