【发布时间】:2015-02-19 06:11:05
【问题描述】:
我的日志记录类中有以下功能:
template<class T>
inline T ErrLog(T ret, const char* Format, ...)
{
va_list args; va_start( args, Format ); _vsnprintf(mypWorkBuffer, MaxLogLength, Format, args); va_end(args);
// do some fancy logging with mypWorkBuffer
return ret;
}
(mypWorkBuffer 在别处定义)
这对我来说是一个非常方便的快捷方式,因为我可以记录一个错误并在一行中退出,这通过排除错误处理使代码更具可读性:
int f(x) {
if (x<0) return ErrLog(-1, "f error, %d too small", x);
...
}
(而不是
int f(x) {
if (x<0) {
Log("f error, %d too small", x);
return -1;
}
...
}
)
我遇到的问题是如果 f 返回 void。我想做
void f(x) {
if (x<0) return ErrLog(void, "f error, %d too small", x);
...
}
但这不会编译。
我想到了专业化,那就是加:
inline void ErrLog(const char* Format, ...)
{
va_list args; va_start( args, Format ); _vsnprintf(mypWorkBuffer, MaxLogLength, Format, args); va_end(args);
// do some fancy logging with mypWorkBuffer
return;
}
这让我可以做
return ErrLog("f error, %d too small", x);
但是我不确定返回 char* 的函数是否安全。例如考虑:
char* f(x) {
if (x<0) return ErrLog("error", "f error , %d too small", x);
...
}
我认为这个会匹配模板和专业化。
有什么想法/更好的解决方案吗?
【问题讨论】:
-
为什么
ret甚至可以通过ErrLog?如果它没有被使用或修改,它就没有任何业务存在。当它是作为模板的唯一原因时,更是如此。 -
你拼错了
throw。 -
etheranger - ret 被返回,这就是 n.m. 的重点。这里没有try catch throw,不知道你指的是什么
-
你可以用不同的名字命名这两个函数。
-
“这里没有try catch throw”。这正是问题所在。