метапрограммирование шаблонов: (черта?) разбиение указанного шаблона на типы T <T2, T3 N, T4,…>
Я пытаюсь определить базовый тип шаблона.T
из типаE = T<T2,T3>
, Это, например, позволило бы создать шаблонную функцию pair_maker (const E & amp; a), которую можно использовать с одним из нескольких похожих типов контейнеров. Грубый метакод:
template <typename T>
auto pairmaker(const E & a) -> PairContents<E,std::string>::type {
ContainerPairMaker<E,std::string>::type output;
... some code ...
return output;
}
PairContents<E,std::string>
преобразовал бы типvector<int>
вvector<pair(int,std::string)>
или жеwhatever<T1>
вwhatever<pair(T1,std::string)>
.
Другой подобный пример разбора типов - для std :: array (или аналогичных контейнеров), где я хотел бы выяснитьcontainer введите новый аналогичный массив. Например, для такого рода функций (сейчас это актуальный рабочий код)
template <typename T >
auto make_some3(const T & a)
-> std::array<typename T::value_type,10*std::tuple_size<T>::value>{
return std::array<typename T::value_type,10*std::tuple_size<T>::value>{} ;
}
Это прекрасно работает, но я хочу сделать то, чтобы явно использовать «std :: array»; автоматический.
Для std :: array есть признак tuple_size, который помогает, и аналогичная вещь может быть использована для поискаtype
для любого второго аргумента, но опять же я не могу думать ни о чем, чтобы найти тип контейнера.
Подводя итог: какое оборудование (если есть) можно использовать для подобных случаев. В какой степени возможно иметь дело со смесью аргументов шаблона, аргументов шаблона-шаблона, любого количества аргументов и не шаблонных аргументов неизвестных типов.