const string buf = vector_of_strings | views::join | ranges::to() 可以工作,但不适用于:views::join_with(vector_of_strings, string_view(", "))

编程语言 2026-07-08

当前,我正用这条语句把一个 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章