summaryrefslogtreecommitdiff
path: root/boost/variant/detail/apply_visitor_delayed.hpp
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2016-03-21 15:45:20 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2016-03-21 15:46:37 +0900
commit733b5d5ae2c5d625211e2985ac25728ac3f54883 (patch)
treea5b214744b256f07e1dc2bd7273035a7808c659f /boost/variant/detail/apply_visitor_delayed.hpp
parent08c1e93fa36a49f49325a07fe91ff92c964c2b6c (diff)
downloadboost-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.hpp65
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