Вложенные типы шаблонов

Я хочу, чтобы тип шаблона был типом шаблона:

template < template < int beta, typename gamma> class alpha >
gamma foo()
{
    // do stuff with beta, gamma
    gamma c[beta]; 
    alpha a();
    alpha b();
}

Я хочу, чтобы гамма и бета определялись значениями, которые я даю, поэтому:

foo< hello<2,double> >()

создаст hello<2,double> объект вместо alpha, а также c будет массив double с 2 элементами.

Итак, я хочу извлечь параметры шаблона из шаблонного класса, переданного в foo.

Как бы я это сделал?

1 ответ

Предоставленное вами объявление шаблона принимает так называемый параметр template-template (параметр шаблона типа шаблона). Однако приведенный вами пример использования пытается передать "обычный" класс в качестве аргумента (после того, как все параметры шаблона зафиксированы, шаблонный класс превращается в "обычный" класс, он больше не является шаблоном).

Это сразу означает, что параметр template-template - это не то, что вам нужно. Параметры шаблона-шаблона служат совершенно другому назначению. (Я не буду вдаваться в подробности здесь).

Одним из возможных решений вашей проблемы является требование, чтобы классы аргументов представляли свои аргументы шаблона через вложенные типы и константы. Т.е. твой hello шаблон должен содержать вложенную константу beta_value и вложенное имя типа gamma_type

template <int BETA, typename GAMMA> class hello 
{
public:
  static const int beta_value = BETA;
  typedef GAMMA gamma_type;
  ...
};

В этом случае ваша функция будет объявлена ​​с параметром шаблона обычного типа

template <typename ALPHA> typename ALPHA::gamma_type foo()
{
   // do stuff with beta, gamma
   typename ALPHA::gamma_type c[ALPHA::beta_value]; 
   ALPHA a();
   ALPHA b();
}

Если какой-либо пользователь забудет следовать соглашению, компилятор откажется компилировать foo и заставить этого пользователя обновить определение класса аргумента.

Другие вопросы по тегам