2011-11-23 127 views
2

我有一个类型如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> 
+0

也许看看这个答案:http://stackoverflow.com/q/213811/296460 – shuttle87

回答

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的答案大致相同,但它对图书馆的支持很好。