使用g++14拼接(concat)ranges的可行实现方案咨询
使用GCC 14拼接Ranges的可行方案
你的代码编译失败的核心原因是:初始化列表{ "{", v | views::join_with(','), "}" }里的元素类型不统一——"{", "}"是const char*类型的字符串字面量,而v | views::join_with(',')是输出char类型元素的视图。C++的std::initializer_list要求所有元素必须是同一类型,编译器无法推导包含不同类型元素的initializer_list<auto>,因此抛出类型冲突的错误。
下面提供两种可行的实现方式:
方法一:用views::concat直接拼接同类型视图
std::views::concat是C++20引入的视图适配器,专门用于拼接多个元素类型相同的range。我们只需要把字符串字面量转换为输出char类型的视图,就能和join_with的输出视图兼容:
#include <ranges> #include <vector> #include <string> using namespace std; int main(){ const vector<string> v = {"1","2","3"}; // 用views::all把字符串字面量转为char类型的视图 const auto combined_view = views::concat( views::all("{"), v | views::join_with(','), views::all("}") ); const string buf = combined_view | ranges::to<string>(); }
views::all("{")会把字符串字面量"{(本质是const char[2]数组)当作char类型的range处理,这样三个输入视图的元素类型都是char,views::concat就能正常拼接,最终通过ranges::to<string>直接生成目标字符串。
方法二:用数组存储同类型视图后合并
如果偏好类似初始化列表的写法,可以用std::array存储所有元素类型为char的视图,再通过views::join合并这些视图的元素:
#include <ranges> #include <vector> #include <string> #include <array> using namespace std; int main(){ const vector<string> v = {"1","2","3"}; const auto ranges = array{ views::all("{"), v | views::join_with(','), views::all("}") }; const auto combined_view = ranges | views::join; const string buf = combined_view | ranges::to<string>(); }
这里std::array可以容纳不同类型但元素类型相同的视图(因为视图都是range概念的实现),views::join会遍历数组中的每个视图,把它们的元素依次输出,最终同样能转换为目标字符串。
内容的提问来源于stack exchange,提问作者Ludovic Aubert
相关产品推荐
相关产品推荐

