1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- [/
- / Copyright (c) 2013 Andrey Semashev
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
- [section:explicit_operator_bool explicit_operator_bool]
- [/=================]
- [simplesect Authors]
- [/=================]
- * Andrey Semashev
- [endsimplesect]
- [/===============]
- [section Overview]
- [/===============]
- 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
- [@http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool 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`.
- [endsect]
- [/===============]
- [section Examples]
- [/===============]
- 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;
- ``
- [endsect]
- [/==============]
- [section History]
- [/==============]
- [heading boost 1.56]
- * Added new macros `BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT` and `BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL` to define `noexcept` and `constexpr` operators.
- * The header moved to Boost.Core.
- [heading boost 1.55]
- * The macro was extracted from Boost.Log.
- [endsect]
- [endsect]
|