如何获取模板模板类的参数

时间:2011-11-23 19:59:16

标签: c++ templates metaprogramming c++11

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

可能是这样的:

// 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>

2 个答案:

答案 0 :(得分:5)

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,因为你必须登记每个可能的模板参数列表种类,并且基本上无限多。

答案 1 :(得分:1)

看起来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>

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

这与johannes-schaub-litb的答案大致相同,但是获得图书馆支持会很好。