0

Я использую C++ 11, и мне нужно что-то вроде преобразования (в СТЛ алгоритм контейнеров), который может превратить template<typename ...T> в <typename ...T::something> так что я могу использовать его для наследования:Алгоритм преобразования на VARIADIC шаблон

например:

template<typename T> 
struct typeOf{ 
    using type = T; 
}; 

template<typename ...T> // All the arguments must be `typeOf`'s 
class tupleOf : tuple<T::type...>{ 
} 

так, что:

tupleOf<typeOf<int>,typeOf<char>> дал бы мне tuple<int,char>

Я хочу сделать это без использования C++ 14 функций

ответ

2

Вы можете сделать что-то вроде:

template <typename T, template <typename> class f> 
struct transform; 


template <template <typename...> class C, typename...Ts, template <typename> class f> 
struct transform<C<Ts...>, f> 
{ 
    using type = C<typename f<Ts>::type...>; 
}; 

и использование:

static_assert(std::is_same<std::tuple<char, int>, 
          transform<std::tuple<char*, int*>, 
            std::remove_pointer>::type>::value, 
       "unexpected"); 

Live Demo.

1

Если вы просто ищете простое решение вашего конкретного вопроса, то это должно работать для вас:

namespace detail { 
    //primary template for when something invalid is passed 
    //could add a static_assert to improve compiler message 
    template<typename... T> struct tupleOf; 

    //partial specialization for when a list of typeOf types are passed 
    template<typename... Ts> 
    struct tupleOf<typeOf<Ts>...> 
    { 
     using type = std::tuple<Ts...>; 
    }; 
} 

//alias template for ease-of-use 
template <typename... Ts> 
using tupleOf = typename detail::tupleOf<Ts...>::type; 

Теперь tupleOf<typeOf<int>,typeOf<char>> эквивалентно std::tuple<int,char>.

0

Простые преобразования уже работают в контексте разрастания шаблонов. Ваш исходный код должен работать нормально, если вы просто добавите ключевое слово typename.

template<typename T> 
struct typeOf{ 
    using type = T; 
}; 

template<typename ...T> // All the arguments must be `typeOf`s 
class tupleOf : tuple<typename T::type...>{ 
}; 

Хотя шаблонный псевдоним, вероятно, лучший выбор.

template <typename... T> 
using tupleOf = tuple<typename T::type...>; 
Смежные вопросы