Похоже, что 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, но было бы хорошо иметь поддержку библиотеки.