2009-08-19 9 views
3

C#が設けられているフォーマットと値を持つ新しい文字列を返すいい静的メソッドC++インライン書式文字列、数値変換

String.Format(string, params string[]); 

を有しています。 C++に相当するものはありますか?私はlog4cxxを使用して、ログレベルDEBUGが有効でない場合、exprが評価されることはありませんように、短絡評価を使用しています

LOG4CXX_DEBUG(logger, expr); 

のようなマクロを利用したいだから

理由があります。私はほぼ効率が短いから出てくるようがありませんので、最初の文字列を割り当てて、フォーマットする必要がありますので、目的を破っている

CString msg; 
msg.Format(formatString, values...); 

LOG4CXX_INFO(_logger, msg); 

は現在、C++で、私はこのようにそれを行います回路論理。

数値の値を使用して簡単なログを作成しようとすると、同様の問題が発生します。これは、コンパイルされません。もう一度puporseを破る

CString asStr; 
asStr.Format("%d", _some-double_); 
LOG4CXX_DEBUG(_logger, "the price is " + asStr); 

LOG4CXX_DEBUG(_logger, "the price is " + _some-double_); 

は、だから私はこのような何かを書くことに終わります。

私はC++の専門家ではないので、知識の豊かな人々が助けることを望んでいます。

ありがとうございます!

答えて

2

標準ライブラリを使用すると、一部のタイプのメモリ割り当てを行わずに書式設定された文字列を生成する方法はありません。 C++ stringクラスには "format"関数自体がありませんので、数値をテキストと連結するにはstringstreamオブジェクトを使用する必要がありますが、これはオブジェクトの割り当てに関係します。 sprintfのようなC関数を見ると、sprintfはメモリ自体を割り当てていないので、事前にcharの配列を割り当てる必要があります。つまり、「string::format」のような静的関数があっても、stringstreamオブジェクトを自分自身に割り当てて操作することよりもスピードを上げることはできません。静的関数は、どんなイベントでも同じことを背景にしています。

+0

少なくとも*いくつかの*メモリを割り当てる必要があるとすれば、オブジェクトの上にPOD配列を割り当てる方がはるかに高速ですので、sprintf/char配列ルートを使用します。 – GRB

8

log4cxxを使用すると、たとえば、書くことができますので、パラメータのようにストリーミング受け入れ:

LOG4CXX_DEBUG(_logger, "the price is " << price); 
3

あなたが戻ってCに落下し

printf(stderr,"The Error(%d) happened(%s)\n",error,errmsg(error)); 

ブーストも形式を持っているのsprintfを使用することができます。

// iostream with boost::format 
std::cerr << boost::format("The Error(%d) happened(%s)\n") % error % errmsg(error); 

あなたは

logger && (std::cerr << Stuff); // Where Stuff can be your boost::format 
+0

+1は 'boost :: format'です。 – avakar

2

をショートカットにしたい場合は、インライン整形を行うには私のお気に入りの方法はboost.formatライブラリです。たとえば:

#include <boost/format.hpp> 
using namespace boost; 

LOG4CXX_INFO(_logger, str(format("cheese it %i, %g") % 1234 % 1.3)); 

それは、ロギングおよびマクロ機能で変数の引数を使用するために非常に便利です。

1

ブーストフォーマットライブラリを使用するか、独自の小さなバージョン(make_string hereなど)をハンドコードしてください。

関連する問題