如何获取模板类的参数

How take param of the template template class

本文关键字:参数 何获取 获取      更新时间:2023-10-16

我有一个类似Type<Param>的类型。如何在c++11中检索参数?

可能是这样的:

// I know it's not correct but it conveys the idea very well
template
<
   template <class Param> class Type 
>
struct GetParam
{
   typedef Param Result;
};
// e.g.
typedef GetParam<std::vector<double>>::Result X; // must return double
typedef GetParam<std::list<double>>::Result X; // double
typedef GetParam<std::vector<std::list<double>>::Result X; // std::list<double>
template<class Type>
struct GetParam;
template<template<typename ...> class Tmp, typename T1, typename ...Types>
struct GetParam<Tmp<T1, Types...>> {
  typedef T1 type;
};

然而,传递给GetParam的类模板特化只能有类型模板参数。例如,你不能通过std::array。做一个完全通用的GetParam是不可能的,因为您必须登记每一个可能的模板参数列表的变化,基本上有无限多。

看起来tr2可能在类型特征中有一个类型列表。在g++-4.7中,你可以这样写:

template<class Type>
  struct GetParam2;
template<template<typename ...> class Tmpl, typename Type, typename ...Types>
  struct GetParam2<Tmpl<Type, Types...>>
  {
    typedef typename std::tr2::typelist<Type, Types...> tlist;
    typedef typename tlist::first::type type;
    typedef typename tlist::rest::type types;
  };
typedef GetParam2<std::vector<double>>::type dbl2; // double
static_assert(std::is_same<dbl, dbl2>::value, "Ouch");
typedef GetParam2<std::list<double>>::type dbl2; // double
typedef GetParam2<std::vector<std::list<double>>>::type listdbl2; // std::list<double>
static_assert(std::is_same<listdbl, listdbl2>::value, "Ouch");
typedef GetParam2<std::array<double, 3>>::type arrdbl; // std::list<double>

一切正常,但最后一行数组。也许我用错了。

和johannesschaub -litb的答案差不多,但是如果有库的支持就好了。