最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<filesystem>

# std::filesystem::path::operator>>(C++17)

    namespace std::filesystem {
      template <class CharT, class Traits>
      std::basic_istream<CharT, Traits>&
        operator>>(std::basic_istream<CharT, Traits>& is, path& p); // (1) C++17
    }

    template <class CharT, class Traits>
    friend std::basic_istream<CharT, Traits>&
      operator>>(std::basic_istream<CharT, Traits>& is, path& p);   // (2) C++20

## 概要

ストリームから入力する。

`path`オブジェクトにおいては、パス文字列が入力されること。

- 入力されるパス文字列のフォーマットは、システムフォーマットでも、システム非依存フォーマットどちらでも受け入れられる
- 入力されるパス文字列は、ダブルクォーテーション囲みされていても、されていなくても、どちらでも受け入れられる

## 効果

以下と等価：

    std::basic_string<CharT, Traits> tmp;
    is >> quoted(tmp);
    p = tmp;

## 戻り値

`is`

## 備考

- この関数は、C++20で非メンバ関数から、friendメンバ関数に変更された。そのため、`std::filesystem::operator<<`という完全名の指定では呼び出せず、ADLによって呼び出すことになる

## 例

### POSIXベースシステムでの例

    #include <cassert>
    #include <sstream>
    #include <filesystem>

    namespace fs = std::filesystem;

    int main()
    {
      std::istringstream ss {"\"a/b/c\""};

      fs::path p;
      ss >> p;

      assert(p.native() == "a/b/c");
    }

#### 出力

### Windowsでの例

    #include <cassert>
    #include <sstream>
    #include <filesystem>

    namespace fs = std::filesystem;

    int main()
    {
      std::istringstream ss {"\"a/b/c\""};

      fs::path p;
      ss >> p;

      assert(p.native() == L"a/b/c");
    }

#### 出力

## バージョン

### 言語

- C++17

### 処理系

- Clang:
- GCC: 8.1 ✅
- Visual C++: 2017 Update 7 ✅

## 参照

- P1601R0 Recommendations for Specifying "Hidden Friends"
- Hidden Friends - yohhoyの日記
- The Power of Hidden Friends in C++ - Just Software Solutions
- LWG 2989. `path`'s stream insertion operator lets you insert everything under the sun