검색결과 리스트
글
bool operator idiom
Programming/C++
2015. 2. 13. 11:45
http://en.wikibooks.org/wiki/More_C++_Idioms/Safe_bool
흐 - 음.
선 기록 후 정리
struct Testable { operator bool() const { return false; } }; struct AnotherTestable { operator bool() const { return true; } }; int main (void) { Testable a; AnotherTestable b; if (a == b) { /* blah blah blah*/ } if (a < 0) { /* blah blah blah*/ } // The above comparisons are accidental and are not intended but the compiler happily compiles them. return 0; }
Solution
class Testable { bool ok_; typedef void (Testable::*bool_type)() const; void this_type_does_not_support_comparisons() const {} public: explicit Testable(bool b=true):ok_(b) {} operator bool_type() const { return ok_ ? &Testable::this_type_does_not_support_comparisons : 0; } }; template <typename T> bool operator!=(const Testable& lhs, const T&) { lhs.this_type_does_not_support_comparisons(); return false; } template <typename T> bool operator==(const Testable& lhs, const T&) { lhs.this_type_does_not_support_comparisons(); return false; } class AnotherTestable ... // Identical to Testable. {}; int main (void) { Testable t1; AnotherTestable t2; if (t1) {} // Works as expected if (t2 == t1) {} // Fails to compile if (t1 < 0) {} // Fails to compile return 0; }
In C++11, the explicit
keyword can now be applied to conversion operators. As with constructors, it prevents the use of those conversion functions in implicit conversions. However, language contexts that specifically require a boolean value (the conditions of if-statements and loops, as well as operands to the logical operators) count as explicit conversions and can thus use a bool conversion operator.
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 }