c – 如果函数返回类型为void,我应该如何调用可变参数包中的所有
发布时间:2020-12-16 09:48:36 所属栏目:百科 来源:网络整理
导读:我有一个完整的默认可构造的参数包,然后是可调用的对象(如ExampleFunctor),并希望按顺序(从左到右)调用所有这些对象.如果返回类型是除void之外的任何内容,我可以使用初始化列表来执行此操作: struct ExampleFunctor{ void operator()(){someGlobal = 4;}};t
我有一个完整的默认可构造的参数包,然后是可调用的对象(如ExampleFunctor),并希望按顺序(从左到右)调用所有这些对象.如果返回类型是除void之外的任何内容,我可以使用初始化列表来执行此操作:
struct ExampleFunctor{ void operator()(){someGlobal = 4;} }; template<typename... Ts> struct CallThem { void operator()(){ auto list = {Ts()()...}; } } 但是如果返回类型为void,则此技巧不起作用. 我可以将所有Ts包装在一个包装器中,返回一个int,但这似乎有点过分了,这段代码最终将在带有32K闪存的皮质M3上运行,所以如果我在调试中编译单元,那么包装器的额外函数调用开销会很痛苦模式(在释放模式下调试会让我的大脑受伤). 有没有更好的办法? 解决方法
使用逗号运算符:
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)列表是禁止警告(未使用的变量). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |