const string buf = vector_of_strings | views::join | ranges::to() 可以工作,但不适用于:views::join_with(vector_of_strings, string_view(", "))
当前,我正用这条语句把一个 vector<string> 的值拼接起来:
const string buf = configAbsoluteFilesNames | views::join | ranges::to<string>();
并且它能工作:在下面的程序中,我得到的是:
/i_do_not_exist/a.file/i_do_not_exist/b.file
但我想在一个 cpp
views::join_with(configAbsoluteFilesNames, string_view(", ")) 里面使用:
views::join_with(configAbsoluteFilesNames, string_view(", "))
instead. So that I could have problematic values separated by a , :
/i_do_not_exist/a.file, /i_do_not_exist/b.file
但我不太明白要如何在专门的语句里实现这个改动。
#include <format>
#include <memory>
#include <print>
#include <ranges>
#include <string>
#include <string_view>
#include <sstream>
#include <vector>
using namespace std;
int main() {
vector<string> configAbsoluteFilesNames = {"/i_do_not_exist/a.file",
"/i_do_not_exist/b.file"};
auto join = views::join_with(configAbsoluteFilesNames, string_view(", ")); // unused yet. How to integrate it in the statement below?
const string buf = configAbsoluteFilesNames | views::join | ranges::to<string>();
string message = format("Failed to read configuration file: {}", buf);
println("{}", message);
return 0;
}
我已经尝试过:
const string buf = configAbsoluteFilesNames |
views::join_with(configAbsoluteFilesNames, string_view(", ")) |
ranges::to<string>();
那看起来是最接近应该怎样做的写法,但编译时出现错误:
No viable operator| matches arguments of type vector<string> and ranges::join_with_view<ranges::ref_view<vector<string>>, string_view>.
我应该如何把这个改动落到实践中?我使用的是C++ 23。
解决方案
你几乎做对了。
const string buf = configAbsoluteFilesNames |
std::views::join_with(std::string(", ")) |
std::ranges::to<std::string>();
使用管道时,应该省略第一个参数 configAbsoluteFilesNames。
你的原始代码很可能应该是:
auto buf = ranges::to<string>(
views::join_with(configAbsoluteFilesNames, string_view(", ")));
它们两者都会输出
Failed to read configuration file: /i_do_not_exist/a.file, /i_do_not_exist/b.file
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。