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

How to test if a type parameter is a template type

本文关键字:是否 类型 类型参数 何测试 测试      更新时间:2023-10-16

假设我有一个这样的模板类:

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 可用的嵌入式系统和/或因为我的内存受到严重限制)

你可以用这样的东西接近:

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;
}

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

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

相关文章: