使用所有基本类型的C ++,可以简单地查询:
if(varname)
并将类型转换为布尔值以进行评估。有没有办法在用户定义的类中复制此功能?我的一个类是由整数标识的,虽然它有许多其他成员,我希望能够以这种方式检查整数是否设置为NULL。
感谢。
答案 0 :(得分:28)
C ++ 11的方法是:
from Core in
(from Core in db.Core
where
Core.DCID == @0 &&
(from Response in db.Response
where
Core.CoreID == Response.AspNetUsers.CoreID &&
Core.DCID == @1 &&
Response.CreatedOn.Value.Year == Convert.ToDateTime(DateTime.Now).Year &&
Response.CreatedOn.Value.Month == Convert.ToDateTime(DateTime.Now).Month
select new {
Response,
Response.AspNetUsers
}).Single() != null
select new {
Core.CoreName,
Dummy = "x"
})
group Core by new { Core.Dummy } into g
select new {
Column1 = g.Count(p => p.CoreName != null)
}
请注意阻止编译器隐式转换的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
}
关键字。
答案 1 :(得分:23)
您可以定义用户定义的转换运算符。这必须是成员函数,例如:
class MyClass {
operator int() const
{ return your_number; }
// other fields
};
您还可以实现operator bool。但是,我强烈建议不要这么做,因为你的类可以在算术表达式中使用,这很快就会导致混乱。例如,IOStream定义转换为void*
。您可以像测试void*
一样测试bool
,但void*
没有语言定义的隐式转化。另一种方法是使用所需的语义定义operator!
。
简而言之:定义转换运算符sto整数类型(包括布尔值)是一个非常糟糕的主意。
答案 2 :(得分:9)
只需为您的班级实施operator bool()
。
e.g。
class Foo
{
public:
Foo(int x) : m_x(x) { }
operator bool() const { return (0 != m_x); }
private:
int m_x;
}
Foo a(1);
if (a) { // evaluates true
// ...
}
Foo b(-1);
if (b) { // evaluates true
// ...
}
Foo c(0);
if (c) { // evaluates false
// ...
}
答案 3 :(得分:4)
正如其他人所说,使用operator int ()
或operator bool ()
是不好主意,因为它允许转换。使用指针是更好的主意。到目前为止,这个问题的最佳解决方案是返回一个成员(函数)指针:
class MyClass {
void some_function () {}
typedef void (MyClass:: * safe_bool_type) ();
operator safe_bool_type () const
{ return cond ? &MyClass::some_function : 0; }
};
答案 4 :(得分:-1)
C ++检查语句结果是否等于零。所以我认为你可以为你的类定义相等运算符,并定义你的类在不同条件下如何与零不同。