13

次のコードは、パスが存在する場合にパスの最初の部分を削除することを目的としています。

#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。ここでデイブに同意します。パスをパス要素のコンテナーと見なすことは、(プログラマーの観点から) 非常に自然な見方だと思います。

4

1 に答える 1