ユーザー定義のタイプからstd :: stringを使用して自動キャストを取得することは可能ですか?

StackOverflow https://stackoverflow.com/questions/4000358

質問

質問のように、クラスの文字列演算子を定義する場合:

class Literal {
  operator string const () {
    return toStr ();
  };

  string toStr () const;
};

そして、私はそれを使用します:

Literal l1 ("fa-2bd2bc3e0");
cout << (string)l1 << " Declared" << endl;

明示的なキャストですべてが正しくなりますが、(文字列)を削除すると、コンパイラはSTD :: Stringで宣言されたキャストオペレーターが必要だと言います。それは私のタイプを自動的にキャストするべきではありませんか?解決:私はオペレーターをオーバーロードしています<<(Ostream&OS、const literal&l)。

役に立ちましたか?

解決

いいえ。STD:: Stringには、文字通りを議論として取ったコンストラクターが必要です。

あなたができることは、あなたのリテラルクラスのためにオペレーターをオーバーロードし、そこにストリームに挿入して挿入することです。

ostream &operator <<(std::ostream &stream, const Literal &rhs)
{
    stream << (string) rhs;
    return stream;
}

他のヒント

短い答え:キャストを使用し続けます toStr(), 、またはあなた自身を書いてください operator<< 関数。 (を好む l1.toStr()(string)l1.)

長い答え:標準ライブラリに機能があれば機能する可能性があります

std::ostream& operator<<( std::ostream&, std::string const& );

それはほとんどそうではありませんが、技術的にはそうではありません。両方 ostreamstring テンプレートのインスタンス化のtypedefsです。また、一方を他方に挿入するためのテンプレート関数があります。

// This is somewhat simplified.  For the real definitions, see the Standard
// and/or your complying implementation's headers.
namespace std {
  typedef basic_string<char> string;
  typedef basic_ostream<char> ostream;

  template <typename CharT>
  basic_ostream<CharT>& operator<<(
    basic_ostream<CharT>&, 
    basic_string<CharT> const&);
}

だからあなたが使用するとき cout << str ここでのタイプ strstd::string, 、そのテンプレート関数を使用することを理解できます。 CharT = char.

ただし、C ++では、コンパイラに暗黙の型変換の両方を理解することはできません(Literalstring)そして、テンプレート関数テンプレートパラメーターを推定します(CharT = char)同じ呼び出しで。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top