c++ - 为什么不能从 `std::filesystem::path` 迭代器构造 `std::filesystem::path` ?

标签 c++ c++17 std-filesystem

以下代码旨在去除路径的第一部分,以防它存在:

#include <filesystem>

std::filesystem::path strip_prefix(std::filesystem::path p)
{      
  if (auto it{p.begin()}; it != p.end())
  {
    ++it;
    return std::filesystem::path(it, p.end());
  }

  return p;
}

(参见:https://godbolt.org/z/wkXhcw)

我很惊讶地发现这不起作用。该代码无法编译,因为路径构造函数仅采用迭代字符序列的迭代器。我可以看到它的用途,但是为什么将构造仅限于那些迭代器呢?在我看来,不支持从自己的迭代器构建路径是违反直觉的。据我所知,大多数其他 STL 类型都支持这种习惯用法。

除了完全重建一条新路径之外,实现相同目标的有效实现方式是什么?

更新:在这种情况下,我发现以下讨论相关/有趣:http://boost.2283326.n4.nabble.com/boost-filesystem-path-frustration-td4641734.html .我同意戴夫的观点。我认为将路径视为路径元素的容器是一种非常自然的方式来看待它(从程序员的角度来看)。

最佳答案

连接段以创建新 path 的最简单解决方案就是 std::accumulate()

对于您的特定用例,我会这样做:

std::filesystem::path strip_prefix(std::filesystem::path p)
{
    if(p.empty()) return p;
    return std::accumulate(std::next(p.begin()), p.end(), 
                           std::filesystem::path{}, std::divides{});
}

至于为什么没有构造函数(或者可能是自由函数)来执行此操作?我不知道。在使用路径时,这似乎是一个相当大的需求,但如果可以通过调用标准算法来实现相同的结果,委员会确实倾向于不愿意向标准类添加便利函数。

关于c++ - 为什么不能从 `std::filesystem::path` 迭代器构造 `std::filesystem::path` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53743338/

相关文章:

在派生模板类中使用 typedef 时,C++ 虚拟模板参数引发错误

c++ - 将对象传递给函数时,如何防止模板化构造函数将类作为参数

c++ - 从 2D 混合数组和 vector 中释放内存

c++ - 如何从 C++ 中的字符串中解析逗号分隔的整数

c++ - 将 OpenCV 与 Qt 链接时出错

c++ - 是否有任何巧妙的方法可以从数组 vector 中获取指向数据的指针?

c++ - wchar_t 的 isalpha 等价物

c++ - `std::filesystem::directory_iterator` 优雅处理不存在的目录

c++ - 从std::filesystem::path C获取绝对路径

c++ - std::在 C++/17 中没有成员 "filesystem"