(C++ 11なし)ログは現在、我々のコードベースは、次のようなコードをたくさん持っている:C++繰延
void log(int level, const char *msg) {
// logLevel is some global int defining which messages to log
if (level <= logLevel) {
cout << msg << endl;
}
}
...
int someNum = 3;
if (1 <= logLevel) {
char msg[200];
sprintf(msg, "Some format %d", someNum);
log(1, msg);
}
我々は、Visual Studio 2008を使用しているので、任意の機能を使用することはできませんC++ 11。閉鎖をログメソッドに渡すきれいな方法があるので、重複した "if"条件を削除できますか?例えば、私は事前にC++ 11構文で、次のコードと同等を探しています:
void log(int level, std::function<std::string()> getMessage) {
if (level <= logLevel) {
cout << getMessage() << endl;
}
}
...
int someNum = 3;
log(1, [someNum]() -> std::string {
std::ostringstream sstream;
sstream << "Some format " << someNum;
return sstream.str();
});
私が思い付くことが最高です:マクロは、一般的に推奨されていない場合でも
struct LogMessage {
virtual std::string operator()() const = 0;
};
void log(int level, const LogMessage &getMessage) {
if (level <= logLevel) {
cout << getMessage() << endl;
}
}
...
struct X : public LogMessage {
X(int num) : myNum(num) { }
std::string operator()() const {
std::ostringstream out;
out << "Some format " << myNum;
return out.str();
}
private: const int myNum;
} a(someNum);
log(1, a);
あなたは条件が2回試験された場合(呼び出し側によっておよび機能をログ)を避けるためにしたいですか? – jpo38
ローカル構造体はテンプレート(C++ 03)で使用できないので、あなたが持つことができる最高のものだと思います。 – Jarod42
@ jpo38はい、あなたの解釈は正しいです。 –