为什么无法从 std::filesystem::path 迭代器构建 std::filesystem::path?
Why is it not possible to construct a `std::filesystem::path` from `std::filesystem::path` iterators?
以下代码旨在去除路径的第一部分,以防它存在:
#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 类型都支持这个习惯用法。
除了完全重建新路径之外,实现相同目标的有效实施是什么?
更新:在这种情况下,我发现了以下讨论relevant/amusing: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{});
}
至于为什么没有构造函数(或者可能是自由函数)来执行此操作?我不知道。在使用路径时,这似乎是一种需要,但如果通过调用标准算法可以获得相同的结果,委员会确实倾向于不愿意向标准 类 添加便利函数。
以下代码旨在去除路径的第一部分,以防它存在:
#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 类型都支持这个习惯用法。
除了完全重建新路径之外,实现相同目标的有效实施是什么?
更新:在这种情况下,我发现了以下讨论relevant/amusing: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{});
}
至于为什么没有构造函数(或者可能是自由函数)来执行此操作?我不知道。在使用路径时,这似乎是一种需要,但如果通过调用标准算法可以获得相同的结果,委员会确实倾向于不愿意向标准 类 添加便利函数。