【发布时间】:2016-08-24 21:26:46
【问题描述】:
目前,我们的代码库有很多如下代码:
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 的任何功能。有没有一种干净的方法可以将闭包传递给 log 方法,所以我可以删除重复的“if”条件?例如,我正在寻找与 pre 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);
【问题讨论】:
-
您想避免 if 条件被测试两次(通过调用者和日志函数)?
-
由于本地结构不能在模板中使用(在 c++03 中),我会说这是你能拥有的最好的。
-
@jpo38 是的,你的解释是正确的。
-
@JeffG:那么宏可以帮助你。它们通常用于设置跟踪系统。
-
将函数传递给函数,然后在里面执行传递的函数,会不会比简单的第二次整数比较更糟糕?