/*============================================================================= Copyright (c) 2012 Paul Fultz II match.h 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) ==============================================================================*/ #ifndef BOOST_HOF_GUARD_FUNCTION_OVERLOAD_H #define BOOST_HOF_GUARD_FUNCTION_OVERLOAD_H /// match /// ===== /// /// Description /// ----------- /// /// The `match` function adaptor combines several functions together and /// resolves which one should be called by using C++ overload resolution. This /// is different than the [`first_of`](/include/boost/hof/conditional) adaptor which resolves /// them based on order. /// /// Synopsis /// -------- /// /// template /// constexpr match_adaptor match(Fs...fs); /// /// Requirements /// ------------ /// /// Fs must be: /// /// * [ConstInvocable](ConstInvocable) /// * MoveConstructible /// /// Example /// ------- /// /// #include /// using namespace boost::hof; /// /// struct int_class /// { /// int operator()(int) const /// { /// return 1; /// } /// }; /// /// struct foo /// {}; /// /// struct foo_class /// { /// foo operator()(foo) const /// { /// return foo(); /// } /// }; /// /// typedef match_adaptor fun; /// /// static_assert(std::is_same::value, "Failed match"); /// static_assert(std::is_same::value, "Failed match"); /// /// int main() {} /// /// References /// ---------- /// /// * [POO51](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0051r2.pdf) - Proposal for C++ /// Proposal for C++ generic overload function /// #include #include #include #include #include #include namespace boost { namespace hof { template struct match_adaptor; template struct match_adaptor : detail::callable_base, match_adaptor { typedef match_adaptor base; typedef match_adaptor fit_rewritable_tag; struct failure : failure_for, Fs...> {}; BOOST_HOF_INHERIT_DEFAULT(match_adaptor, detail::callable_base, base); template), BOOST_HOF_ENABLE_IF_CONSTRUCTIBLE(base, Xs...)> constexpr match_adaptor(X&& f1, Xs&& ... fs) : detail::callable_base(BOOST_HOF_FORWARD(X)(f1)), base(BOOST_HOF_FORWARD(Xs)(fs)...) {} using F::operator(); using base::operator(); }; template struct match_adaptor : detail::callable_base { typedef detail::callable_base base; typedef match_adaptor fit_rewritable_tag; using F::operator(); BOOST_HOF_INHERIT_CONSTRUCTOR(match_adaptor, detail::callable_base); }; BOOST_HOF_DECLARE_STATIC_VAR(match, detail::make); }} // namespace boost::hof #endif