On Fri, 07 Mar 2003 11:46:24 +0100, Sam Partington wrote: > Hate to sound pushy, but I've no answer on this, were the patches ok?
>> >> Daniel Frey wrote: >> > No problem. IIRC it was Peter Dimov who came up with the safe-bool >> > idiom first. At least I saw it first from him. Another way which >> > works but results in worse error messages is this: >> > >> > template <class T, class B = ::boost::detail::empty_base> struct >> > bool_testable : B >> > { >> > private: >> > operator int() const; >> > >> > public: >> > operator bool() const >> > { >> > return !!static_cast< T& >( *this ); >> > } >> > }; One problem I just found with your implementation (and thus with Peter's idiom in general) is, that is doesn't provide an operator bool(). This may sound weird, an example hopefully clears things up: #include <iostream> using namespace std; #include <boost/operators.hpp> struct A : boost::bool_testable< A > { bool operator!() const { cout << "operator!" << endl; return false; } operator int() const { cout << "operator int()" << endl; return 42; } }; int main() { A a; if( a ) cout << "Hello, world!" << endl; // int i = a; // long l = a; } The code above happily compiles without warnings but it calls operator int(). Several options come to mind: - Document it that the class T of bool_testable< T > shall not have any other operators that might conflict. - Use the above alternative implementation I showed. It is not as nice as yours/Peter's wrt error-messages, but it works as expected. - Convince the standard committee that "explicit operator bool" is needed :) See: http://groups.google.de/groups?hl=de&lr=&ie=UTF-8&frame=right&th=d0969f0fa2460dd4&seekm=3A2D10EE.35544D0A%40aixigo.de#link1 Thoughts? Regards, Daniel _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost