C++可变参数模板:折叠表达式能否被转vector迭代替代?
能否弃用C++折叠表达式,改用参数包转容器迭代的方式?
背景与思路
C++17引入折叠表达式后,我学会了用args OP ...这类形式编写可变参数模板代码。但日常处理长参数列表时,更习惯使用array或vector配合for/while循环迭代的方式。
最近我发现C++支持将可变参数模板的参数包直接转换为普通vector,示例代码如下:
template<class ... Args> void foo() { using arg_type = typename std::common_type_t<Args...>; std::vector<arg_type> arr = {args...}; }
由此我认为,所有可变参数模板场景都可以用这种容器迭代的方式替代折叠表达式——毕竟折叠表达式仅支持对参数包调用二元运算符,局限性很大;而将参数包转为容器后,能自由对参数执行任意操作,代码也更直观易读。
实际场景示例
打印排序后的参数
要实现打印排序后参数的功能,用容器迭代的方式非常简洁:
template<class ... Args> void printSorted(const Args& ... args) { using arg_type = typename std::common_type_t<Args...>; vector<arg_type> arg_vec = { args ... }; sort(arg_vec.begin(), arg_vec.end()); for(const auto& a : arg_vec) { cout << a << " "; } cout << endl; } printSorted(3, 1, 5, 3, 7, 8, 2, 0);
这种功能用折叠表达式很难实现,即便能写出代码,可读性也会非常差。
处理模板非类型参数
对于模板非类型参数的场景,转成容器后逻辑同样清晰易懂:
template<bool ... args> int read_binary_value() { const vector<bool> vals = { args ... }; int res = 0; for(int i = 0; i < vals.size(); ++i) { res <<= 1; res += vals[i]; } return res; } cout << read_binary_value<1, 0, 1>() << endl;
核心疑问
那我是否可以完全弃用折叠表达式,统一采用这种参数包转容器迭代的技术来处理所有可变参数模板场景?
内容的提问来源于stack exchange,提问作者Andrey Rubliov
相关产品推荐
相关产品推荐

