c ++将类转换为boolean

时间:2010-07-29 06:28:26

标签: c++ boolean user-defined-types

使用所有基本类型的C ++,可以简单地查询:

if(varname)

并将类型转换为布尔值以进行评估。有没有办法在用户定义的类中复制此功能?我的一个类是由整数标识的,虽然它有许多其他成员,我希望能够以这种方式检查整数是否设置为NULL。

感谢。

5 个答案:

答案 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 ++检查语句结果是否等于零。所以我认为你可以为你的类定义相等运算符,并定义你的类在不同条件下如何与零不同。