我目前使用以下模板作为检查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,它只是将括号内的任何文本转换为字符串。
以下是我的模板实现的缺点(至少我的用法)
无论如何我可以自动确定第一个变量的“名称”,以便我可以省略每次调用时将其作为第二个参数传入吗?
答案 0 :(得分:9)
你可以将它全部放在一个宏中:
#define IS_NULL(name_) isnull(name_, #name_)
请注意BOOST_STRINGIZE
扩展其参数,如果它是一个宏,可能是你想要的,也可能不是你想要的:
#define X(x_) std::cout << BOOST_STRINGIZE(x_) << " = " << x_ << std::endl;
X(NULL); // prints: "0 = 0"
答案 1 :(得分:1)
当然,为什么不:
#define new_isnull(x) isnull(x, BOOST_STRINGIZE(x))
答案 2 :(得分:1)
在词汇上做任何事情的唯一方法就是使用宏。如果您总是想要正确的打印输出,最好的选择是将整个语句包装在一个宏中:
//if( !(isnull(dim, BOOST_STRINGIZE(dim))) ) return false;
#define ISNULL(a) isnull((a), #a)
if (!ISNULL(dim)) return false;
请注意,与往常一样,宏有许多与之相关的缺点。