...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
Header <boost/core/explicit_operator_bool.hpp>
provides BOOST_EXPLICIT_OPERATOR_BOOL()
, BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()
and BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL()
compatibility helper macros that expand
to an explicit conversion operator to bool
.
For compilers not supporting explicit conversion operators introduced in
C++11 the macros expand to a conversion operator that implements the safe bool
idiom. In case if the compiler is not able to handle safe bool idiom
well the macros expand to a regular conversion operator to bool
.
Both macros are intended to be placed within a user's class definition. The
generated conversion operators will be implemented in terms of operator!()
that should be defined by user in this class. In case of BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL()
the generated conversion operator will
be declared constexpr
which
requires the corresponding operator!()
to also be constexpr
.
template< typename T > class my_ptr { T* m_p; public: BOOST_EXPLICIT_OPERATOR_BOOL() bool operator!() const { return !m_p; } };
Now my_ptr
can be used in
conditional expressions, similarly to a regular pointer:
my_ptr< int > p; if (p) std::cout << "true" << std::endl;
BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT
and BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL
to define noexcept
and
constexpr
operators.