| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | /*=============================================================================    Copyright (c) 2014 Paul Fultz II    static.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_STATIC_H#define BOOST_HOF_GUARD_FUNCTION_STATIC_H/// static/// ======/// /// Description/// -----------/// /// The `static_` adaptor is a static function adaptor that allows any/// default-constructible function object to be static-initialized. Functions/// initialized by `static_` cannot be used in `constexpr` functions. If the/// function needs to be statically initialized and called in a `constexpr`/// context, then a `constexpr` constructor needs to be used rather than/// `static_`./// /// Synopsis/// --------/// ///     template<class F>///     class static_;/// /// Requirements/// ------------/// /// F must be:/// /// * [ConstFunctionObject](ConstFunctionObject)/// * DefaultConstructible/// /// Example/// -------/// ///     #include <boost/hof.hpp>///     #include <cassert>///     using namespace boost::hof;/// ///     // In C++ this class can't be static-initialized, because of the non-///     // trivial default constructor.///     struct times_function///     {///         double factor;///         times_function() : factor(2)///         {}///         template<class T>///         T operator()(T x) const///         {///             return x*factor;///         }///     };/// ///     static constexpr static_<times_function> times2 = {};/// ///     int main() {///         assert(6 == times2(3));///     }/// #include <boost/hof/detail/result_of.hpp>#include <boost/hof/reveal.hpp>namespace boost { namespace hof { template<class F>struct static_{    struct failure    : failure_for<F>    {};    const F& base_function() const    BOOST_HOF_NOEXCEPT_CONSTRUCTIBLE(F)    {        static F f;        return f;    }    BOOST_HOF_RETURNS_CLASS(static_);    template<class... Ts>    BOOST_HOF_SFINAE_RESULT(F, id_<Ts>...)     operator()(Ts && ... xs) const    BOOST_HOF_SFINAE_RETURNS(BOOST_HOF_CONST_THIS->base_function()(BOOST_HOF_FORWARD(Ts)(xs)...));};}} // namespace boost::hof#endif
 |