/ / Как да тествате дали даден тип параметър е тип шаблон - c ++, шаблони

Как да тествате дали даден тип параметър е тип шаблон - c ++, шаблони

Кажи, че имам шаблонна класа като така:

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

Не можете да. Тип шаблон никога не се извършва до време на работа, Трябва да го инстанциирате (това води допълен нов тип) и след това компилаторът генерира необходимия код, за да изглежда така, сякаш сте дефинирали специално за типовите параметри, които сте посочили. Наистина, в старите компилатори (това е решено много време), когато създавате генеричен тип в няколко компилационни единици, което води до няколко повторения на същия код в крайната програма. Но както казах, това е решено преди време.