ostream から const char* に変換したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 15年前
住所: 東京

ostream から const char* に変換したい

#1

投稿記事 by MoNoQLoREATOR » 14年前

void function(const char * str){}
ostringstream oss;
function(oss<<"abc");

なんてことができたら便利だなと思ったのですが、<<演算子を使うとstd::basic_ostream<_Elem,_Traits>が返される上に、これをstringやconst char*に変換することができません。どうすればよいでしょうか?

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: ostream から const char* に変換したい

#2

投稿記事 by beatle » 14年前

コード:

void f(const char* s);
ostringstream oss;
f(dynamic_cast<ostringstream&>(oss << "abc").str().c_str());
こんな感じにできます。

たかぎ
記事: 328
登録日時: 15年前
住所: 大阪
連絡を取る:

Re: ostream から const char* に変換したい

#3

投稿記事 by たかぎ » 14年前

いっそのこと...

コード:

template <class charT, class traits, class T>
inline T& put(std::basic_ostream<charT, traits>& os, T& value)
{
    os << value;
    return value;
}
上のような関数を作っておいて、

コード:

function(put(oss, "abc"));
のようにした方が便利ではないですか?

アバター
MoNoQLoREATOR
記事: 284
登録日時: 15年前
住所: 東京

Re: ostream から const char* に変換したい

#4

投稿記事 by MoNoQLoREATOR » 14年前

自動的に変換されるように、グローバルな演算子オーバーロードを定義しようと思ったのですが、エラーが出てしまいました。グローバルな演算子オーバーロードを定義する際は第1引数に「属することになるクラス」を指定する必要があるそうですが、この場合どのように指定すべきなのでしょうか?

コード:

template <class charT, class traits, class T>
operator const char* (const basic_ostream<charT, traits> &os){
	return (dynamic_cast<ostringstream&> os).str().c_str();
}
エラー内容

コード:

'operator const char *' は静的でないメンバでなければなりません

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: ostream から const char* に変換したい

#5

投稿記事 by beatle » 14年前

MoNoQLoREATOR さんが書きました:エラー内容

コード:

'operator const char *' は静的でないメンバでなければなりません
このエラーが言うとおり、型変換演算子 operator const char* ()は、何かしらのクラスのメンバである必要があります。グローバルにはできない演算子なのです。
どうしてもbasic_ostreamにこの演算子を導入したければ、C++標準化委員会に提案して、basic_ostreamの定義を変えてもらいましょう。

閉鎖

“C言語何でも質問掲示板” へ戻る