Вложенные типы шаблонов
Я хочу, чтобы тип шаблона был типом шаблона:
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
и заставить этого пользователя обновить определение класса аргумента.