C++

2013-05-08 3 views
10

Czy to możliwe, aby zmienić zachowanie if() tak, aby:C++

class Foo { 
    int x; 
}; 

Foo foo; 
if(foo) 

tylko przechodzi jeżeli wartość x jest czymś innym niż zero? lub ...

Czy wyraźna, zdefiniowana przez użytkownika konwersja typu do int work/byłaby odpowiednia? lub ...

Czy najlepiej zrobić coś w rodzaju if(foo.getX())?

+4

Jeśli trzeba to w kontekście C++ 03, to może zajrzeć do bezpiecznego idiomu bool: http://www.artima.com/cppsource/safebool .html – Yuushi

Odpowiedz

22

można przekonwertować obiekt do wartości logicznej poprzez zdefiniowanie operator bool():

explicit operator bool() const 
{ 
    return foo.getX(); 
} 

explicit kluczowe zapobiega niejawne konwersje z Foo do bool. Na przykład, jeśli przypadkowo umieścisz foo w wyrażeniu arytmetycznym, takim jak foo + 1, kompilator może wykryć ten błąd, jeśli zadeklarujesz operator bool() jako explicit, w przeciwnym razie foo zostanie przekonwertowany na bool, nawet jeśli nie jest przeznaczony.

Ogólnie, funkcji składowych postaci

operator TypeName() 

(przy użyciu explicit i const kwalifikacyjnych) są operatorzy konwersji. Pozwala rzutować klasę na dowolny typ określony przez TypeName. W innym kierunku, konstruktorzy z jednym argumentem pozwalają rzucić dowolny typ do klasy:

class Foo { 
    Foo(int x); // convert int to Foo 
    operator bool() const; // convert Foo to bool 
    int x; 
}; 

Definiuje niejawne konwersje dla swojej klasy. Kompilator spróbuje zastosować te konwersje, o ile jest to możliwe (np. Co robi dla wbudowanych typów danych, np. 5 + 1.0). Możesz je zadeklarować jako explicit, aby pominąć niepożądane konwersje niejawne.

+7

Podkreślenie tego jest prawdopodobnie lepsze. – chris

+1

Ty ** zdecydowanie ** chcesz oznaczyć to wyraźne, chyba że chcesz pozwolić ludziom robić rzeczy takie jak '! MyClass'. – templatetypedef

11

Można zdefiniować operator przekonwertować obiekt do bool

class Foo 
{ 
    int x; 
public: 
    operator bool() const 
    { 
    return x > 0; 
    } 
}; 

Ale to może mieć niezamierzone konsekwencje z powodu ukrytych konwersji do bool jeśli nie pragnąć nawrócenia się odbyć. Na przykład

int x = 42 + Foo(); 

C++ 11 rozwiązuje ten problem, pozwalając na zadeklarować operatora konwersji jako explicit, który następnie umożliwia konwersje niejawne tylko w pewnych kontekstach, takich jak w ramach rachunku if.

explicit operator bool() const // allowed in C++11 

Teraz

int x = 42 + Foo(); // error, no implicit conversion to bool 
int x = 42 + static_cast<bool>(Foo()); // OK, explicit conversion is allowed