Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
#ifndef GENERS_COLLECTTUPLENAMES_HH_
#define GENERS_COLLECTTUPLENAMES_HH_

#include <cassert>
#include <string>
#include <utility>
#include <vector>

namespace gs {
    namespace Private 
    {
        template<typename Tuple, int N>
        struct TupleNameCycler
        {
            inline static void collect(const Tuple& t,
                                       std::vector<std::string>* n)
            {
                TupleNameCycler<Tuple, N-1>::collect(t, n);
                n->push_back((std::get<N-1>(t)).name());
            }
        };

        template<typename Tuple>
        struct TupleNameCycler<Tuple, 0>
        {
            inline static void collect(const Tuple&,
                                       std::vector<std::string>* s)
                {assert(s); s->clear();}
        };
    }

    template<typename Pack>
    std::vector<std::string> collectTupleNames(const Pack& pack)
    {
        std::vector<std::string> v;
        Private::TupleNameCycler<Pack,std::tuple_size<Pack>::value>::collect(
            pack, &v);
        return v;
    }
}

#endif // GENERS_COLLECTTUPLENAMES_HH_