Кажи, че имам шаблонна класа като така:
template < typename TParam >
class Test
{
// content
};
Искам да извадя първия параметър на шаблона TParam
ако това е специализация на шаблон на класа. Нещо като:
template < typename TParam >
class Test
{
using TParamInner = TemplateType<TParam>::Type;
// use TParamInner here
};
Допълнителна информация:
- Имам достъп до всички C ++ 98.
- Имам достъп до подгрупа C ++ 11.
- Бих предпочел да се избегне stdlib, ако е възможно (предполагам, че това е защото използвам вградена система, за която няма данни и / или защото съм силно задържан от паметта)
Отговори:
2 за отговор № 1Можете да се доближите до нещо като:
template <class >
struct first_template_param;
template <template <class...> class Z, class T, class... Ts>
struct first_template_param<Z<T, Ts...>> {
using type = T;
}
Тя няма да се справи std::array
или всякакви други шаблони за класове, които приемат параметри на шаблон, различни от типа. Но ще се справяте с всички "нормални" шаблони на класа. Винаги можете да добавите допълнителни специализации за всички, които искате:
template <class T, size_t N>
struct first_template_param<std::array<T,N>> {
using type = T;
}
0 за отговор № 2
Благодарение на @ Barry за подтикване на решението заедно.
Това не е пълен отговор за всички типове шаблони, но работи и за шаблони, където всички параметри са типове, което е голям брой от най-полезните шаблони.
template < typename Head, typename ... Tail >
struct split { using first = Head; };
template <class >
struct cls_template_info; // fails on non-templates
template <template <class...> class Z, class... Ts>
struct cls_template_info<Z<Ts...>>
{
using type = typename split<Ts...>::first; // typename used to disambiguate
};
Това може да се използва като using T = cls_template_info<std::vector<int>>::first;
.
-1 за отговор № 3
Не можете да. Тип шаблон никога не се извършва до време на работа, Трябва да го инстанциирате (това води допълен нов тип) и след това компилаторът генерира необходимия код, за да изглежда така, сякаш сте дефинирали специално за типовите параметри, които сте посочили. Наистина, в старите компилатори (това е решено много време), когато създавате генеричен тип в няколко компилационни единици, което води до няколко повторения на същия код в крайната програма. Но както казах, това е решено преди време.