• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function template
    <iomanip>

    std::quoted

    namespace std {
      template <class CharT>
      unspecified quoted(const CharT* s,
                         CharT delim=CharT('"'),
                         CharT escape=CharT('\\'));                       // (1)
    
      template <class CharT, class Traits, class Allocator>
      unspecified quoted(const std::basic_string<CharT, Traits, Allocator>& s,
                         CharT delim=CharT('"'),
                         CharT escape=CharT('\\'));                       // (2)
    
      template <class CharT, class Traits>
      unspecified quoted(std::basic_string_view<CharT, Traits> s,
                         CharT delim = CharT('"'),
                         CharT escape = CharT('\\'));                     // (3) C++17
    
      template <class CharT, class Traits, class Allocator>
      unspecified quoted(std::basic_string<CharT, Traits, Allocator>& s,
                         CharT delim=CharT('"'),
                         CharT escape=CharT('\\'));                       // (4)
    }
    

    概要

    囲み文字指定で入出力する。

    このマニピュレータを使用してcout << quoted("hello");とすると、「"hello"」のように、引用符で囲まれた文字列が出力される。逆に、引用符で囲まれた文字列をcin >> quoted(s);のように入力すると、引用符が外された文字列を取得できる。

    このような囲み文字を指定しての入出力は、たとえばXMLの属性や、CSVのフィールドで使用する。

    • (1) : 出力用のオーバーロード。文字配列を、囲み文字で修飾する。
    • (2) : 出力用のオーバーロード。std::basic_string型の文字列を、囲み文字で修飾する。
    • (3) : 出力用のオーバーロード。std::basic_string_view型の文字列を、囲み文字で修飾する。
    • (4) : 入力用のオーバーロード。囲み文字で修飾された入力から、囲まれている文字列を抽出する。

    効果

    • (1), (2), (3) : この関数で返された結果を出力ストリームに渡すと、以下のシーケンスが出力される。出力ストリームは、そのシーケンスに対して書式を適用する。
      1. delimを出力する。
      2. sの各要素を出力する。それら要素がdelimもしくはescapeと等しい場合、要素の前にescapeを出力する。
      3. delimを出力する。
    • (4) : この関数で返された結果を入力ストリームに渡すと、以下のように入力される。
      • 開始の文字が、std::char_traits<CharT>::eq()関数で比較してdelimと等価である場合、
        1. skipwsフラグをオフにする。
        2. s.clear()を呼び出す。
        3. エスケープされないdelimが読み込まれるか、ストリームが終端に達するまで、sに1文字ずつ読み込まれ追加される(escape文字以外)。
        4. 最後のdelimが破棄される。
        5. skipwsフラグを、元の値に戻す。
      • そうでない場合、istream >> sで読み込みが行われる。
      • この関数で返された結果を出力ストリームに渡した場合は、(2)の動作となる。

    #include <iostream>
    #include <sstream>
    #include <string_view>
    #include <iomanip>
    
    int main()
    {
      // (1) : ダブルクォーテーションで文字列を囲んで出力する
      {
        std::stringstream ss;
        ss << std::quoted("hello");
        std::cout << "(1) : " << ss.str() << std::endl;
      }
    
      // (2) : std::basic_string文字列をシングルクォーテーションで囲んで出力する
      {
        std::string s = "hello";
    
        std::stringstream ss;
        ss << std::quoted(s, '\'');
        std::cout << "(2) : " << ss.str() << std::endl;
      }
    
      // (3) : std::basic_string_view文字列を、ダブルクォーテーションで囲んで出力する
      {
        std::string_view sv = "hello";
    
        std::stringstream ss;
        ss << std::quoted(sv);
        std::cout << "(3) : " << ss.str() << std::endl;
      }
    
      // (4) : ダブルクォーテーションで囲まれた文字列を抽出する
      {
        std::stringstream ss;
        ss << "\"hello\"";
    
        std::string input;
        ss >> std::quoted(input);
        std::cout << "(4) : " << input << std::endl;
      }
    
      // (4) : ダブルクォーテーションで囲まれていない文字列も読み込める
      {
        std::stringstream ss;
        ss << "hello";
    
        std::string input;
        ss >> std::quoted(input);
        std::cout << "(4)-2 : " << input << std::endl;
      }
    }
    

    出力

    (1) : "hello"
    (2) : 'hello'
    (3) : "hello"
    (4) : hello
    (4)-2 : hello
    

    バージョン

    言語

    • C++14

    処理系

    参照