1 //-----------------------------------------------------------------------------
2 // boost variant/detail/generic_result_type.hpp header file
3 // See http://www.boost.org for updates, documentation, and revision history.
4 //-----------------------------------------------------------------------------
9 // Distributed under the Boost Software License, Version 1.0. (See
10 // accompanying file LICENSE_1_0.txt or copy at
11 // http://www.boost.org/LICENSE_1_0.txt)
13 #ifndef BOOST_VARIANT_DETAIL_GENERIC_RESULT_TYPE_HPP
14 #define BOOST_VARIANT_DETAIL_GENERIC_RESULT_TYPE_HPP
16 #include <boost/config.hpp>
18 //////////////////////////////////////////////////////////////////////////
19 // (workaround) macro BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE
21 // On compilers with BOOST_NO_VOID_RETURNS, this macro provides a route
22 // to a single syntax for dealing with template functions that may (but
23 // not necessarily) return nothing (i.e. void).
25 // BOOST_VARIANT_AUX_RETURN_VOID provided for compilers w/ (erroneous?)
26 // warnings about non-void functions not returning a value.
29 #if !defined(BOOST_NO_VOID_RETURNS)
31 #define BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(T) \
35 #define BOOST_VARIANT_AUX_RETURN_VOID \
38 #define BOOST_VARIANT_AUX_RETURN_VOID_TYPE \
42 #else // defined(BOOST_NO_VOID_RETURNS)
45 namespace detail { namespace variant {
47 struct fake_return_void
54 fake_return_void(const T&)
60 struct no_void_returns_helper
66 struct no_void_returns_helper<void>
68 typedef fake_return_void type;
71 }} // namespace detail::variant
74 #define BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(T) \
75 BOOST_DEDUCED_TYPENAME \
76 ::boost::detail::variant::no_void_returns_helper< T >::type \
79 #define BOOST_VARIANT_AUX_RETURN_VOID \
80 return ::boost::detail::variant::fake_return_void() \
83 #define BOOST_VARIANT_AUX_RETURN_VOID_TYPE \
84 ::boost::detail::variant::fake_return_void
86 #endif // BOOST_NO_VOID_RETURNS workaround
88 #endif // BOOST_VARIANT_DETAIL_GENERIC_RESULT_TYPE_HPP