Частичная специализация сделает работу за вас:
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
внутри.