Daniel Frey wrote: >> >> 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 ); > } > }; > > It should be a more efficient implementation for most of the points > Dave mentioned and it should also work in all cases (allowing the use > as a bool, int is private, thus not accessible and other conversions, > e.g. to 'long' are ambiguous. The drawback is, that the error > messages are not as clear and obvious as for Peter's idiom.
Well we'll stick with Peter's model then. I had figured it was Peter, someone let me know if it wasn't. Sam Partington (me!) wrote: > Is there another alternative to this? How about this: > > typedef void (bool_testable<T,B>::*unspecified_bool_type)() const; > operator unspecified_bool_type() const > { > return !static_cast<const T&>(*this) ? 0 : > reinterpret_cast<unspecified_bool_type>(&bool_testable<T,B>::operator > unspecified_bool_type); > } > > > Does this have any issues that I can't see? Ideally we could avoid > the reinterpret_cast, but how do you express the type of a > user-defined conversion operator for the type you're trying to > express? Beats me! I was hoping for a response to this, but I know we're all busy, so I'll take the silence to mean that noone has any serious objections. I know lots of you will see the reinterpret_cast and start shouting "non-portable" but in this case all its doing is casting the return type of the function pointer. Also we're not going to use the pointer other than a compare to zero, so providing there are no compilers that would reinterpret_cast to a zero, I don't see a problem. This is my preferred solution for now, as it avoids a lot of the overhead problems that have worried some of you. I've attached the patches, including docs and test. Sam
operators_test.cpp.patch
Description: Binary data
operators.htm.patch
Description: Binary data
operators.hpp.patch
Description: Binary data
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost