libfilezilla
apply.hpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines