C++14 make code cleaner

在C++11中我们如果要写一个通过tuple实现函数调用的函数要这样写:

    template<int...>
    struct IndexTuple{};

    template<int N, int... Indexes>
    struct MakeIndexes : MakeIndexes<N - 1, N - 1, Indexes...>    {};

    template<int... indexes>
    struct MakeIndexes<0, indexes...>
    {
        typedef IndexTuple<indexes...> type;
    };

    template<typename F, int ... Indexes, typename ... Args>
    static void call_helper(F f, IndexTuple<Indexes...>, const std::tuple<Args...>& tup)
    {
        f(std::get<Indexes>(tup)...);
    }

    template<typename F, typename ... Args>
    static void call(F f, const std::tuple<Args...>& tp)
    {
        call_helper(f, typename MakeIndexes<sizeof... (Args)>::type(), tp);
    }

在C++14中MakeIndexes和IndexTuple已经由utility库提供了,我们可以写得更简洁了,两个函数就可以了。

    template<typename F, size_t... I, typename ... Args>
    static void call_helper(F f, std::index_sequence<I...>, const std::tuple<Args...>& tup)
    {
        f(std::get<I>(tup)...);
    }

    template<typename F, typename ... Args>
    static void call(F f, const std::tuple<Args...>& tp)
    {
        call_helper(f, std::make_index_sequence<sizeof... (Args)>(), tp);
    }

这样写更省心啦o(∩_∩)o 。

原文地址:https://www.cnblogs.com/qicosmos/p/4916404.html