c++;将类转换为布尔值 使用C++的所有基本类型,可以简单地查询: if(varname)
并将类型转换为布尔值进行计算。有没有办法在用户定义的类中复制此功能?我的一个类由一个整数标识,尽管它有许多其他成员,我希望能够检查整数是否以这种方式设置为NULLc++;将类转换为布尔值 使用C++的所有基本类型,可以简单地查询: if(varname),c++,boolean,user-defined-types,C++,Boolean,User Defined Types,并将类型转换为布尔值进行计算。有没有办法在用户定义的类中复制此功能?我的一个类由一个整数标识,尽管它有许多其他成员,我希望能够检查整数是否以这种方式设置为NULL 谢谢。只需为您的类实现操作符bool() e、 g 可以定义用户定义的转换运算符。这必须是一个成员函数,例如: class MyClass { operator int() const { return your_number; } // other fields }; 您还可以实现操作符bool。但是,我强烈建议不要这
谢谢。只需为您的类实现
操作符bool()
e、 g
可以定义用户定义的转换运算符。这必须是一个成员函数,例如:
class MyClass {
operator int() const
{ return your_number; }
// other fields
};
您还可以实现操作符bool。但是,我强烈建议不要这样做,因为你的类将在算术表达式中变得可用,这可能会很快导致混乱。例如,IOStreams定义到void*
的转换。您可以使用与测试bool
相同的方法测试void*
,但是没有来自void*
的语言定义的隐式转换。另一种选择是定义运算符代码>具有所需的语义
简而言之:将转换运算符定义为整数类型(包括布尔型)是一个非常糟糕的主意。C++检查语句结果是否等于零。因此,我认为您可以为类定义相等运算符,并定义类在哪些条件下与零不同。如其他人所述,使用运算符int()
或运算符bool()
是个坏主意,因为它允许进行转换。使用指针是更好的主意。到目前为止,最广为人知的解决方案是返回成员(函数)指针:
C++11方法是:
struct Testable
{
explicit operator bool() const
{ return false; }
};
int main ()
{
Testable a, b;
if (a) { /* do something */ } // this is correct
if (a == b) { /* do something */ } // compiler error
}
请注意explicit
关键字会阻止编译器进行隐式转换。-1,这很容易以不明显的方式中断。查找“安全布尔习惯用法”。C++0x具有显式运算符Bool()
以避免此类隐式破坏?@grayfade:同意-此解决方案并不理想,安全布尔习惯用法是一种更稳健的方法。谷歌搜索“安全布尔”,您将看到不同的解决方案,允许布尔求值,而无需显式转换为Bool,避免常见的转换陷阱。您声明转换为整数类型是个坏主意。。但这正是您的代码片段所做的。同意运算符bool()
会产生意外后果,并且有更好的解决方案。但是转换为void*也不是完美的:foox;删除x代码>现在将编译<代码>布尔运算符!()
更好,但是您仍然需要执行if(!!x)
来测试阳性情况。正如在另一篇评论中所建议的,Safe-Bool习语是最好的解决方案。1)OP显然不知道定义转换运算符的语法,否则他将能够编写最简单的解决方案。所以他学到了一些新东西。2) 我警告过他这是个坏主意。3) 安全布尔更好,但似乎是一个过度工程。如果转换为void*对标准库有好处,对我也有好处。在C++11中,有显式运算符bool()
(在@plats answer和@UncleBens注释中提到)实现了OP想要的功能。我认为,如果这些信息能被包括在被接受的答案中,那将是一件好事。。。该值将转换为布尔值。只是一般来说,转换是从0
到false
以及从任何其他内容到true
的。重要的区别在于,如果定义bool操作符==(类型const&,int)代码>和bool运算符==(int,类型const&)代码>可以将对象与0
进行比较,但不能将对象用作条件。
class MyClass {
void some_function () {}
typedef void (MyClass:: * safe_bool_type) ();
operator safe_bool_type () const
{ return cond ? &MyClass::some_function : 0; }
};
struct Testable
{
explicit operator bool() const
{ return false; }
};
int main ()
{
Testable a, b;
if (a) { /* do something */ } // this is correct
if (a == b) { /* do something */ } // compiler error
}