![]() |
libfilezilla
|
00001 #ifndef LIBFILEZILLA_APPLY_HEADER 00002 #define LIBFILEZILLA_APPLY_HEADER 00003 00004 #include <utility> 00005 #include <tuple> 00006 #include <type_traits> 00007 00016 namespace fz { 00017 00021 template<typename F, typename Tuple, size_t... I> 00022 auto apply_(F&& f, Tuple&& t, std::index_sequence<I...> const&) -> decltype(std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...)) 00023 { 00024 return std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...); 00025 } 00026 00042 template<typename F, typename Tuple, typename Seq = typename std::make_index_sequence<std::tuple_size<typename std::remove_reference<Tuple>::type>::value>> 00043 auto apply(F && f, Tuple&& args) -> decltype(apply_(std::forward<F>(f), std::forward<Tuple>(args), Seq())) 00044 { 00045 return apply_(std::forward<F>(f), std::forward<Tuple>(args), Seq()); 00046 } 00047 00051 template<typename Obj, typename F, typename Tuple, size_t... I> 00052 auto apply_(Obj&& obj, F&& f, Tuple&& t, std::index_sequence<I...> const&) -> decltype((std::forward<Obj>(obj)->*std::forward<F>(f))(std::get<I>(std::forward<Tuple>(t))...)) 00053 { 00054 return (std::forward<Obj>(obj)->*std::forward<F>(f))(std::get<I>(std::forward<Tuple>(t))...); 00055 } 00056 00076 template<typename Obj, typename F, typename Tuple, typename Seq = typename std::make_index_sequence<std::tuple_size<typename std::remove_reference<Tuple>::type>::value>> 00077 auto apply(Obj&& obj, F && f, Tuple&& args) -> decltype(apply_(std::forward<Obj>(obj), std::forward<F>(f), std::forward<Tuple>(args), Seq())) 00078 { 00079 return apply_(std::forward<Obj>(obj), std::forward<F>(f), std::forward<Tuple>(args), Seq()); 00080 } 00081 00082 } 00083 00084 #endif