最終更新日時:
が更新

履歴 編集

function
<iomanip>

std::quoted(C++14)

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 basic_string<CharT, Traits, Allocator>& s,
                     CharT delim=CharT('"'),
                     CharT escape=CharT('\\'));                       // (2)

  template <class CharT, class Traits, class Allocator>
  unspecified quoted(basic_string<CharT, Traits, Allocator>& s,
                     CharT delim=CharT('"'),
                     CharT escape=CharT('\\'));                       // (3)
}

概要

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

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

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

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

効果

  • (1), (2) : この関数で返された結果を出力ストリームに渡すと、以下のシーケンスが出力される。出力ストリームは、そのシーケンスに対して書式を適用する。
    1. delimを出力する。
    2. sの各要素を出力する。それら要素がdelimもしくはescapeと等しい場合、要素の前にescapeを出力する。
    3. delimを出力する。
  • (3) : この関数で返された結果を入力ストリームに渡すと、以下のように入力される。
    • 開始の文字が、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 <iomanip>

int main()
{
  std::stringstream ss;

  // (1), (2) : ダブルクォーテーションで文字列を囲んで出力する
  ss << std::quoted("hello");
  std::cout << ss.str() << std::endl;

  // (3) : ダブルクォーテーションで囲まれた文字列を抽出する
  std::string input;
  ss >> std::quoted(input);
  std::cout << input << std::endl;
}

出力

"hello"
hello

バージョン

言語

  • C++14

処理系

参照