标签:c c11 templates variadic-templates metaprogramming
我有一个完整的默认可构造的参数包,然后是可调用的对象(如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)列表是禁止警告(未使用的变量).
标签:c,c11,templates,variadic-templates,metaprogramming 来源: https://codeday.me/bug/20190728/1564933.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。