c++ - 将 filesystem::path 元素附加到另一个路径的最佳方法是什么?

标签 c++ visual-studio-2012 c++-standard-library

我正在尝试将所选元素从一条路径附加到另一条路径。但是 path.append 方法并不像我期望的那样工作。查看它的实现,它将接受来自字符串的元素,而不是来自路径的元素,这看起来很奇怪。给定一对选择一系列路径元素的路径迭代器,我认为无法将其附加到现有路径或使用它来初始化新路径。

#include <filesystem>
using namespace std;

void TestPathAppend()
{
   path path1("c:\\dir1\\dir2");

   // Fails - constructor cannot construct a path from selected path elements.
   path path2(path1.begin(), path1.end());

   // Ok - constructor _can_ construct a path from a random chunk of string.
   string random("stuff");
   path path3(random.begin(), random.end());

   // Fails - path.append cannot append path elements.
   path path4;
   path4.append(path1.begin(), path1.end());

   // Ok. path.append can append elements from a random chunk of string.
   string random("someoldcobblers");
   path4.append(random.begin(), random.end());

   // What I want to do but can't.
   path::iterator temp = path1.begin();
   advance(temp, 2);
   path4.append(temp, path1.end());
}

更一般地说,路径类接口(interface)似乎设计得很糟糕。它公开了 begin() 和 end() 方法,使遍历路径元素成为可能,给人的印象是它旨在将路径抽象为一组可迭代的路径元素,但没有推送、弹出、追加或构造函数实际上使您能够使用可以迭代的路径元素的方法。它有一个接受迭代器范围对的构造函数和 append() 方法,但它甚至不能接受其他路径迭代器并且仅适用于字符串迭代器,这是完全多余的,因为您已经可以从字符串构造路径并附加一个到另一个的路径,所以那些字符串迭代器方法甚至不启用任何附加功能,它们只是复制已经可用的功能。

我是否误解了这种类型的用途?

实现我想做的事情的最佳方式是什么?

最佳答案

这是你想做的事情吗?

#include <iostream>
#include <filesystem>
#include <numeric>
int main()
{
    path ab("/a/b");
    path cdefgh("c/d/e/f/g/h");

    auto first = std::next(cdefgh.begin(), 2);
    auto last = std::next(cdefgh.begin(), 5);

    auto adefh = std::accumulate(first, last, ab,
                                 [](auto p, const auto& part)
                                 {
                                     return p /= part;
                                 });

    std::cout << adefh << std::endl;
}

预期结果:

"/a/b/e/f/g"

关于c++ - 将 filesystem::path 元素附加到另一个路径的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39387280/

相关文章:

c++ - 存储非负浮点值

javascript - 将文件从React.JS前端移动到C++后端

c++ - 需要帮助调试我的第一个程序,Visual Studio 找不到 .exe 文件。

visual-studio-2012 - 有没有办法在 Visual Studio 2012 中禁用快速查找?

c++ - 两个 `std::map` 的交集

c++ - 为什么 std::advance 不返回结果迭代器?

c++ - C++ 中基于枚举值的专用类构造函数

c++ - 如何使用其复制构造函数和复制赋值是私有(private)的对象?

InstallShield 小更新 - 删除以前的版本

c++ - "augments std"的代码使用什么命名空间?