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
   |  
template <typename T, int i, bool>
    struct S {
             static typename std::tuple_element<i, decltype(T::typelist)>::type actualType = std::tuple_element<i, decltype(T::typelist)>();
    };
    template<>
    template<typename T, int i>
    struct S<T, i, false>
    {
        static void get(int n, T& result)
        {
            //assert(false);
        }
    };
    template <typename T, int i>
    struct S<T, i, true> {
        static void get(int n, T& result) {
            switch(n) {
                case 0 : {
                    actualType = std::get<i>(T::typelist);
                    break;
                }
                    default : {
                    constexpr bool isGreater = (std::tuple_size<decltype(T::typelist)>::value > i + 1);
                    return S<T, i+1, isGreater>::get(n-1, result);
                    break;
                }
            }
        }
        static typename std::tuple_element<i, decltype(T::typelist)>::type actualType;
    }; | 
Partager