using tr2::direct_bases get nth element of result

前端 未结 2 1986
余生分开走
余生分开走 2020-12-21 14:47
struct T1 {};
struct T2: T1 {};

typedef tr2::direct_bases::type NEW_TYPE ;

should return my something like a touple to bases ty

相关标签:
2条回答
  • 2020-12-21 14:55

    Write your own?

    template <typename R, unsigned int N> struct get;
    
    template <typename T, typename ...Args, unsigned int N>
    struct get<std::tr2::__reflection_typelist<T, Args...>, N>
    {
        typedef typename get<std::tr2::__reflection_typelist<Args...>, N - 1>::type type;
    };
    
    template <typename T, typename ...Args>
    struct get<std::tr2::__reflection_typelist<T, Args...>, 0>
    {
        typedef T type;
    };
    

    Or even using first/next:

    template <typename R, unsigned int N>
    struct get
    {
        typedef typename get<typename R::next::type, N - 1>::type type;
    };
    
    template <typename R>
    struct get<R, 0>
    {
        typedef typename R::first::type type;
    };
    

    At this point, I'd say the source code is the best documentation.

    0 讨论(0)
  • 2020-12-21 15:12

    You can use this simple metafunction to turn the typelist into an std::tuple:

    #include <tr2/type_traits>
    #include <tuple>
    
    template<typename T>
    struct dbc_as_tuple { };
    
    template<typename... Ts>
    struct dbc_as_tuple<std::tr2::__reflection_typelist<Ts...>>
    {
        typedef std::tuple<Ts...> type;
    };
    

    At this point, you could work with it as you would normally work with a tuple. For instance, this is how you could retrieve elements of the type list:

    struct A {};
    struct B {};
    struct C : A, B {};
    
    int main()
    {
        using namespace std;
    
        using direct_base_classes = dbc_as_tuple<tr2::direct_bases<C>::type>::type;
    
        using first = tuple_element<0, direct_base_classes>::type;
        using second = tuple_element<1, direct_base_classes>::type;
    
        static_assert(is_same<first, A>::value, "Error!");   // Will not fire
        static_assert(is_same<second, B>::value, "Error!");  // Will not fire
    }
    
    0 讨论(0)
提交回复
热议问题