ユーザー定義のタイプからstd :: stringを使用して自動キャストを取得することは可能ですか?
-
25-09-2019 - |
質問
質問のように、クラスの文字列演算子を定義する場合:
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& );
それはほとんどそうではありませんが、技術的にはそうではありません。両方 ostream
と string
テンプレートのインスタンス化の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
ここでのタイプ str
は std::string
, 、そのテンプレート関数を使用することを理解できます。 CharT = char
.
ただし、C ++では、コンパイラに暗黙の型変換の両方を理解することはできません(Literal
に string
)そして、テンプレート関数テンプレートパラメーターを推定します(CharT = char
)同じ呼び出しで。