template<typename Function, typename Tuple, std::size_t... Index> decltype(auto) invoke_impl(Function&& func, Tuple&& t, std::index_sequence<Index...>) { return func(std::get<Index>(std::forward<Tuple>(t))...); } template<typename Function, typename Tuple> decltype(auto) invoke(Function&& func, Tuple&& t) { constexpr auto size = std::tuple_size<typename std::decay<Tuple>::type>::value; return invoke_impl(std::forward<Function>(func), std::forward<Tuple>(t), std::make_index_sequence<size>{}); }
使用:code
int add(int a, int b) { return a + b; } int main() { std::tuple<int, int> t = std::make_tuple(1, 2); std::cout << invoke(add, t) << std::endl; return 0; }
這裏用到了C++14的std::index_sequence,std::index_sequence頗有用,它能夠將std::array和std::tuple轉換成序列。get