如何在C++中对模板参数包元素应用<<运算符?
无辅助函数的参数包展开实现
你当前借助辅助函数的方案可行,但存在更简洁的实现方式,无需额外定义unpack函数,以下是两种更优方案:
方案1:C++17折叠表达式(推荐)
C++17及以上支持的折叠表达式可直接在原函数内完成展开,代码简洁且可读性高:
template<auto& ... FLAGS> void function(const char *c_str) { std::stringstream strs; (void)(strs << ... << FLAGS); // 二元折叠表达式依次应用每个流操作符 strs << c_str; // ... 后续逻辑 }
(strs << ... << FLAGS)会被编译器展开为strs << FLAGS1 << FLAGS2 << ... << FLAGS_N,完全符合依次应用每个操作符的需求。(void)用于避免部分编译器对表达式结果未使用的警告。
方案2:初始化列表(兼容C++11)
若需兼容C++11(不支持折叠表达式),可利用初始化列表特性展开参数包,同样无需辅助函数:
template<auto& ... FLAGS> void function(const char *c_str) { std::stringstream strs; int dummy[] = { (strs << FLAGS, 0)... }; // 逗号表达式确保先执行流操作 static_cast<void>(dummy); // 消除未使用变量的警告 strs << c_str; // ... 后续逻辑 }
初始化列表会依次计算每个(strs << FLAGS, 0),逗号表达式优先执行strs << FLAGS,再返回0填充数组,从而实现逐个应用操作符的效果。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

