如何测试类型参数是否为模板类型

时间:2016-03-18 13:50:25

标签: c++ templates

假设我有一个类似的模板类:

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(假设这是 因为我正在使用一个没有stdlib可用的嵌入式系统和/或因为我受到很大的内存限制而无法使用它。

3 个答案:

答案 0 :(得分:2)

你可以接近:

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或任何其他采用非类型模板参数的类模板。但它会处理所有&#34;正常&#34;类模板。然后,您可以随时为所需的所有内容添加额外的特化:

template <class T, size_t N>
struct first_template_param<std::array<T,N>> {
    using type = T;
}

答案 1 :(得分:0)

感谢@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;

答案 2 :(得分:-1)

你不能。模板类型永远不会运行到运行时。您必须实例化它(这会导致一个完整的新类型),然后编译器会生成所需的代码,使其看起来就像您专门为您指定的类型参数定义的那样。实际上,在旧的编译器中(很多时候已经解决了)当你在几个编译单元中实例化一个泛型类型时,这导致在最终程序中重复相同的代码。但正如我所说,这已经在很久以前解决了。