You can avoid structuring typeList
by indexing a variational type using something like
struct noTypeInList { }; template <std::size_t, typename ...> struct typeSel; template <typename T0, typename ... Ts> struct typeSel<0U, T0, Ts...> { using type = T0; }; template <std::size_t N, typename T0, typename ... Ts> struct typeSel<N, T0, Ts...> { using type = typename typeSel<N-1U, Ts...>::type; }; template <std::size_t N> struct typeSel<N> { using type = noTypeInList; };
So,
std::make_unique< TypeList<Types...>::T1 > ();
to become
std::make_unique< typeSel<0, Types...>::type > ();
Below is a complete C ++ 11 example if you want std::tuple
std:unique_ptr
#include <tuple> #include <memory> struct noTypeInList { }; template <std::size_t, typename ...> struct typeSel; template <typename T0, typename ... Ts> struct typeSel<0U, T0, Ts...> { using type = T0; }; template <std::size_t N, typename T0, typename ... Ts> struct typeSel<N, T0, Ts...> { using type = typename typeSel<N-1U, Ts...>::type; }; template <std::size_t N> struct typeSel<N> { using type = noTypeInList; }; template <std::size_t ...> struct range { }; template <std::size_t N, std::size_t ... Next> struct rangeH { using type = typename rangeH<N-1U, N-1U, Next ... >::type; }; template <std::size_t ... Next > struct rangeH<0U, Next ... > { using type = range<Next ... >; }; template<typename... Types> class Application { private: std::tuple<std::unique_ptr<Types>...> tpl; template <std::size_t ... rng> Application (const range<rng...> &) : tpl{std::make_tuple(std::unique_ptr< typename typeSel<rng, Types...>::type>()...)} { } public: Application () : Application(typename rangeH<sizeof...(Types)>::type()) { } }; int main() { Application<int, float, int, std::tuple<double, long>> a; }
This is just an example of using typeSel
, because Application
can simply be written as
template<typename... Types> class Application { private: std::tuple<std::unique_ptr<Types>...> tpl; public: Application () : tpl{std::make_tuple(std::unique_ptr<Types>()...)} { } };
If you can use the C ++ 14 compiler, you can use std::index_sequence
and std::make_index_sequence
(and remove range
and rangeH
), and Application
can become
template<typename... Types> class Application { private: std::tuple<std::unique_ptr<Types>...> tpl; template <std::size_t ... rng> Application (const std::index_sequence<rng...> &) : tpl{std::make_tuple(std::unique_ptr< typename typeSel<rng, Types...>::type>()...)} { } public: Application () : Application(std::make_index_sequence<sizeof...(Types)>()) { } };