diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2016-03-21 15:45:20 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2016-03-21 15:46:37 +0900 |
commit | 733b5d5ae2c5d625211e2985ac25728ac3f54883 (patch) | |
tree | a5b214744b256f07e1dc2bd7273035a7808c659f /boost/variant/detail/apply_visitor_delayed.hpp | |
parent | 08c1e93fa36a49f49325a07fe91ff92c964c2b6c (diff) | |
download | boost-733b5d5ae2c5d625211e2985ac25728ac3f54883.tar.gz boost-733b5d5ae2c5d625211e2985ac25728ac3f54883.tar.bz2 boost-733b5d5ae2c5d625211e2985ac25728ac3f54883.zip |
Imported Upstream version 1.58.0upstream/1.58.0
Change-Id: If0072143aa26874812e0db6872e1efb10a3e5e94
Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
Diffstat (limited to 'boost/variant/detail/apply_visitor_delayed.hpp')
-rw-r--r-- | boost/variant/detail/apply_visitor_delayed.hpp | 65 |
1 files changed, 64 insertions, 1 deletions
diff --git a/boost/variant/detail/apply_visitor_delayed.hpp b/boost/variant/detail/apply_visitor_delayed.hpp index 034b39b7ed..29f46141d8 100644 --- a/boost/variant/detail/apply_visitor_delayed.hpp +++ b/boost/variant/detail/apply_visitor_delayed.hpp @@ -17,6 +17,11 @@ #include "boost/variant/detail/apply_visitor_unary.hpp" #include "boost/variant/detail/apply_visitor_binary.hpp" +#include "boost/variant/variant_fwd.hpp" // for BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES + + +#include "boost/variant/detail/has_result_type.hpp" +#include <boost/core/enable_if.hpp> namespace boost { @@ -54,6 +59,18 @@ public: // structors { } +#if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES) + +public: // N-ary visitor interface + template <typename... Visitables> + BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type) + operator()(Visitables&... visitables) const + { + return apply_visitor(visitor_, visitables...); + } + +#else // !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES) + public: // unary visitor interface template <typename Visitable> @@ -72,17 +89,63 @@ public: // binary visitor interface return apply_visitor(visitor_, visitable1, visitable2); } +#endif // !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES) + private: apply_visitor_delayed_t& operator=(const apply_visitor_delayed_t&); }; template <typename Visitor> -inline apply_visitor_delayed_t<Visitor> apply_visitor(Visitor& visitor) +inline typename boost::enable_if< + boost::detail::variant::has_result_type<Visitor>, + apply_visitor_delayed_t<Visitor> + >::type apply_visitor(Visitor& visitor) { return apply_visitor_delayed_t<Visitor>(visitor); } +#if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276) \ + && !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES) + +template <typename Visitor> +class apply_visitor_delayed_cpp14_t +{ +private: // representation + Visitor& visitor_; + +public: // structors + + explicit apply_visitor_delayed_cpp14_t(Visitor& visitor) BOOST_NOEXCEPT + : visitor_(visitor) + { + } + +public: // N-ary visitor interface + template <typename... Visitables> + decltype(auto) operator()(Visitables&... visitables) const + { + return apply_visitor(visitor_, visitables...); + } + +private: + apply_visitor_delayed_cpp14_t& operator=(const apply_visitor_delayed_cpp14_t&); + +}; + +template <typename Visitor> +inline typename boost::disable_if< + boost::detail::variant::has_result_type<Visitor>, + apply_visitor_delayed_cpp14_t<Visitor> + >::type apply_visitor(Visitor& visitor) +{ + return apply_visitor_delayed_cpp14_t<Visitor>(visitor); +} + +#endif // !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276) + // && !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES) + + } // namespace boost #endif // BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP |