2011-11-23 211 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的答案大致相同,但它對圖書館的支持很好。

相關問題