【发布时间】:2010-02-24 19:10:53
【问题描述】:
我目前使用以下模板只是作为检查 NULL 指针的一种方式,如果为 NULL,则将错误消息打印到日志文件,然后返回 false。
template< typename T >
static bool isnull(T * t, std::string name = "")
{
_ASSERTE( t != 0 );
if( !t )
{
if( !(name.length()) ) name = "pointer";
PANTHEIOS_TRACE_ERROR(name + " is NULL");
return false;
}
return true;
}
我目前这样称呼它:
if( !(isnull(dim, BOOST_STRINGIZE(dim))) ) return false;
如果您注意到我需要将要打印到日志文件的指针变量的“名称”作为第二个参数传递。我目前正在使用 BOOST_STRINGIZE,它只是将括号内的任何文本转换为字符串。
以下是我的模板实现的缺点(至少对于我的使用而言)
- 任何人都可以将任何内容作为参数传递给 BOOST_STRINGIZE 以在日志文件中打印出来 - 因为这两个参数无论如何都不相关 - 所以我不一定会看到实际上为 NULL 的“变量名”
- 我们要记得传入第二个参数,否则没用。
无论如何,我是否可以自动确定第一个变量的“名称”,这样我就可以在每次调用时省略将其作为第二个参数传入?
【问题讨论】:
-
除非您使用预处理器魔法,否则这是不可能的。但你总是可以写:
#define IS_NULL(a) isnull((a), #a) -
第二个问题可以通过去掉name参数的默认值来解决。只有切线相关,使用“name.empty()”可能比“!name.length()”更快和/或更清晰
-
@Mark-B。感谢您的“空”评论:)。我想我只是假设由于 vector.empty() 实际上调用了 size() (在 VC++ 2005 实现中),因此字符串可能是相同的。糟糕的ossandcad。
标签: c++