Как принять параметры шаблона шаблона класса - PullRequest
2 голосов
/ 23 ноября 2011

У меня есть тип как Type<Param>. Как я могу получить 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>

Ответы [ 2 ]

5 голосов
/ 24 ноября 2011
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 голос
/ 24 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...