1

I have a class like this:

#include <tuple>

// Models is supposed to be a tuple<class... Classes>
template<class Models>
class MyClass
{
    std::tuple<
        std::tuple_element<0,Models>::type::NestedType,
        std::tuple_element<1,Models>::type::NestedType,
        std::tuple_element<2,Models>::type::NestedType
        > nestedTypedTuple;
};

Currently nestedTypedTuple is of fixed size of 3 elements, which is too small for larger-sized Models and won't work at all for smaller-sized Models. I'd like to define it in a more generic way, so that its declaration worked for any number of elements in Models. It seems using the ways given here for iterating over tuple won't work because I need to derive a type, not call a function here.

What would be a working approach?

Community
  • 1
  • 1
Ruslan
  • 18,162
  • 8
  • 67
  • 136

1 Answers1

2

Option #1

template <class Models> class MyClass; // leave undefined

template <class... Ts>
class MyClass<std::tuple<Ts...>>
{
    std::tuple<typename Ts::NestedType...> nestedTypedTuple;
};

Option #2

template <class Models>
class MyClass
{
    template <std::size_t... Is>
    static std::tuple<typename std::tuple_element<Is, Models>::type::NestedType...> helper(std::index_sequence<Is...>);
    using NestedTypedTuple = decltype(helper(std::make_index_sequence<std::tuple_size<Models>::value>{}));

    NestedTypedTuple nestedTypedTuple;
};
Piotr Skotnicki
  • 46,953
  • 7
  • 118
  • 160