如何替换从 boost::filesystem::weakly_relative 和 std::filesystem::canonical 中删除的基本参数

How to replace the base parameter removed from boost::filesystem::weakly_relative and std::filesystem::canonical

函数boost::filesystem::canonical()doc of 1.66, doc of current release) offers two arguments (ignoring the error code overload) base. The first one is the path to canonicalize, the second argument is the base path used to make the first path absolute if it is relative. By default current_path()用于此参数。

Boost 1.60引入了一些新功能,其中boost::filesystem::weakly_canonical() (doc of 1.66, doc of current release). This function is missing this second argument. The same is true for the standardized (C++17) variants std::filesystem::canonical() and std::filesystem::weakly_canonical() (see cppreference).

我想把canonical()换成weakly_canonical(),但是我用了第二个参数。这就是我意识到这个论点被删除的方式。现在我想知道为什么它被删除以及我如何自己使路径成为绝对路径。

我找到了一个 defect report which hinted to this resolution for C++17,但坦率地说,我不太明白其中的道理。我很高兴有一个解释,或者更好的例子,其中 base 的重载会被过度指定。

当然,我想知道我应该如何使用不是当前目录的基目录将相对路径转换为绝对路径。我是否应该像 cppreference for std::filesystem::absolute() 中提示的那样简单地使用 base / p 因为我知道这是我的目标系统上的正确形式(Windows 使用 Visual C++)?

OK,当你有一个相对路径,想要调用这样一个函数时,可能会出现以下情况:

  1. 你知道路径是相对于 current_path
  2. 您知道可以通过调用 absolute 使路径成为绝对路径。请注意,由于像 Windows 这样的文件系统,这与 不是一回事 current_path.
  3. 相关
  4. 你知道路径是相对于一些已知的 absolute_path 而不是当前路径。
  5. 你不知道路径是不是相对路径。

在案例 #4 中,您的第一步需要确定它是否是相对的,如果是,它是相对于什么。完成后,您将返回案例 1-3。

在第 1-3 种情况中,您都有一种直接的方法来计算绝对路径。在情况 1 中,您使用 current_path() / rel。在情况 2 中,您使用 absolute(rel)。在情况 3 中,您使用 absolute_path / rel。 (注意:这不仅是"the correct form on my target system (Windows with Visual C++)",这是正确的形式period。)

canonical/weakly_canonical的原始版本中,函数只处理情况1和情况3。情况2无法在函数内处理。通过使函数处于较低级别,通过使它们使用 absolute 作为相对路径而不是采用默认为 current_path() 的基本路径,这允许函数处理情况 2 以及其他情况。

他们本可以更改它,以便重载不采用将使用 absolute 的路径(而不是默认 current_path())。但实际上,canonical(rel, absolute_path)canonical(absolute_path / rel) 之间有什么区别?事实上,后者使你在做什么更清楚,因为它把绝对路径放在左边,也就是它去的地方。