#ifndef SPROUT_TUPLE_FUSED_HPP #define SPROUT_TUPLE_FUSED_HPP #include #include #include #include #include namespace sprout { namespace tuples { // // fused // template class fused { public: typedef F functor_type; private: functor_type f_; private: template SPROUT_CONSTEXPR auto call(Tuple&& t, sprout::index_tuple) const -> decltype(f_(sprout::tuples::get(sprout::forward(t))...)) { return f_(sprout::tuples::get(sprout::forward(t))...); } public: fused() = default; fused(fused const&) = default; explicit SPROUT_CONSTEXPR fused(F f) : f_(f) {} SPROUT_CONSTEXPR functor_type functor() const { return f_; } template SPROUT_CONSTEXPR auto operator()(Tuple&& t) const -> decltype(this->call( sprout::forward(t), sprout::index_range<0, sprout::tuples::tuple_size::type>::value>::make() )) { return call( sprout::forward(t), sprout::index_range<0, sprout::tuples::tuple_size::type>::value>::make() ); } }; // // make_fused // template inline SPROUT_CONSTEXPR sprout::tuples::fused make_fused(F const& f) { return sprout::tuples::fused(f); } } // namespace tuples using sprout::tuples::fused; using sprout::tuples::make_fused; } // namespace sprout #endif // #ifndef SPROUT_TUPLE_FUSED_HPP