ページ 11

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

Posted: 2011年11月12日(土) 19:20
by MoNoQLoREATOR
void function(const char * str){}
ostringstream oss;
function(oss<<"abc");

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

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

Posted: 2011年11月12日(土) 19:47
by beatle

コード:

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

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

Posted: 2011年11月12日(土) 22:48
by たかぎ
いっそのこと...

コード:

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"));
のようにした方が便利ではないですか?

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

Posted: 2011年11月13日(日) 01:31
by MoNoQLoREATOR
自動的に変換されるように、グローバルな演算子オーバーロードを定義しようと思ったのですが、エラーが出てしまいました。グローバルな演算子オーバーロードを定義する際は第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 *' は静的でないメンバでなければなりません

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

Posted: 2011年11月13日(日) 08:41
by beatle
MoNoQLoREATOR さんが書きました:エラー内容

コード:

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