Получение типа из предыдущего параметра шаблона - PullRequest
1 голос
/ 02 апреля 2011

Как мне добиться чего-то подобного:

//where Low's parameter is of a type of Range's first parameter  
Range<char,Low<5>> range; 

Проблема, с которой я здесь сталкиваюсь, заключается в том, что я хотел бы / чтобы тип Low имел свой параметр в зависимости от первого параметра Range, например:

template<class IntType,class LowType>
struct Range
{
};

и имеющий:

template<class T>//how to do it that this parameter is of a type of Ranges first parameter?
struct Low
{
};

Возможно ли это?

Ответы [ 3 ]

3 голосов
/ 02 апреля 2011

Частичная специализация сделает работу за вас:

template<class IntType, class LowType>
struct Range;
                               //vvvvv
template<class IntType, template<class, IntType> class LowType, IntType N>
struct Range< IntType, LowType<IntType, N> >{
                             //^^^^^^^
  // implementation here
};

Редактировать
Он работает с некоторыми изменениями, показанными выше, но вам нужно изменить шаблон Low struct:

template<class IntType, IntType N>
struct Low{
};

И используйте его, как показано здесь, на Ideone . Но тогда возникает вопрос: зачем вам дополнительная структура Low? Не хватит ли следующего?

template<class IntType, IntType Low>
struct Range;

И если вам действительно нужна эта структура Low, вы всегда можете сделать следующее (используя приведенную выше структуру Low):

template<class IntType, IntType LowNum>
struct Range{
  typedef Low<IntType,LowNum> LowType;
  // ...
};

И используйте его как Range<int,5>, делая использование Range более удобным для пользователя, при этом все еще используя структуру Low внутри.

1 голос
/ 02 апреля 2011

Хотя я не уверен, что правильно понимаю вашу цель, я публикую это на всякий случай, если это может быть вам подсказкой.Если разрешены некоторые модификации, следующая установка может соответствовать цели:

template< class T, T V > struct Low {
  typedef T underlying_type;
};

template< class T > struct Range {
  typedef typename T::underlying_type value_type; // example
};

Range< Low<char,5> > range;

Надеюсь, это поможет

0 голосов
/ 02 апреля 2011

Второй параметр Range шаблона класса должен быть записан как

template<class IntType, template<int N> class LowType>
struct Range          //^^^^^^^^^^^^^^ note this!
{
};

И определить Low шаблон класса как,

template<int N>  //note the difference!
struct Low
{
};

ПРИМЕЧАНИЕ: Low шаблон класса принимает целочисленную константу значение , а не тип в качестве аргумента!

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