我有类似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>
答案 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的答案大致相同,但是获得图书馆支持会很好。