2011-04-17 26 views
4

皆さん!私は、書式設定された文字列を返すsprintfの単純なコピーを作成しようとしていますが、私は小さなスラグに来ています...C++可変長引数リストからstd :: stringを抽出

どうやら、可変長引数リストを使用すると、std :: stringインスタンス。

私はすでにパーサーがint、double、float、char、const char *、char *で正しく動作しています。まだ文字列を取得していません。 :\

あなたが迷っている場合は、これは私が手コンパイルエラーです:私は、サードパーティのライブラリに依存することなく、便利なフォーマットを持つことができるように、私はこれをやっている/root/learncpp/StringFormat/main.cpp:8: warning: cannot pass objects of non-POD type 'struct std::string' through '...'; call will abort at runtime

主な理由は、 、私は使用する文字列のインスタンスごとにごとに ".c_str()"をに追加する必要はありません。

これは役に立ちます。おそらく、C++のために特別に作られた可変長引数リストの異なるバージョンがありますか?

EDIT:文字列へのポインタを渡すと(すなわち、&接頭辞を使用して)、それはうまく動作します。あなたがしなければならないのは、std :: stringのアドレスを渡しながら、カスタムsprintfの文字列ポインタを参照解除することだけです。

可変長の引数リストを使用して文字列を直接サポートする方法があるかどうかは分かります。ありがとう!

答えて

3

いいえ - コンパイラは言ったように、あなたはPOD型のオブジェクトを可変関数に渡すことしかできません。

通常は、printf(sprintfではなくstringstream)の代わりにiostreamを使用するなど、variadic関数を使用しないでください。

+1

私がsprintfが好きな理由は、int/doubleを文字列に自動的に変換し、それを使用するうまい形式です。 iostreams/stringstreamsは、多くの変数とスペーサー、つまり「こんにちは%s、時間は%d:%d:%d、%d番目の月の%d日目」を混在させていると私には不器用に思えます。 – FurryHead

+3

あなたはBoost形式を見ましたか? http://www.boost.org/doc/libs/1_46_0/libs/format/index.html –

+0

@ジェリーは、時々働くことが大変なことはありませんか?私はいくつかの人がリンクするかコンパイルするのを苦労しているのを見てきました。(どちらが覚えられないか) – FurryHead

関連する問題