Есть ли "нормальный" унарный логический оператор в C ++ - PullRequest
3 голосов
/ 21 января 2012

Я имею в виду, мы все знаем, что есть логический оператор отрицания !, и его можно использовать так:

class Foo
{
public:
    bool operator!() { /* implementation */ }
};

int main()
{
    Foo f;
    if (!f)
        // Do Something
}

Есть ли оператор, который позволяет это:*

Я знаю, что это может быть не важно, но просто интересно!

Ответы [ 3 ]

7 голосов
/ 21 января 2012

Вы можете объявить и определить operator bool() для неявного преобразования в bool, если вы осторожны .

Или напишите:

if (!!f)
   // Do something
3 голосов
/ 21 января 2012

Поскольку operator bool() сам по себе довольно опасен, мы обычно используем то, что называется идиома safe-bool :

class X{
  typedef void (X::*safe_bool)() const;
  void safe_bool_true() const{}
  bool internal_test() const;
public:
  operator safe_bool() const{
    if(internal_test())
      return &X::safe_bool_true;
    return 0;
  }
};

В C ++ 11мы получаем явные операторы преобразования; вышеприведенная идиома устарела :

class X{
  bool internal_test() const;
public:
  explicit operator bool() const{
    return internal_test();
  }
};
2 голосов
/ 21 января 2012
operator bool() { //implementation };
...