Проблема специализации шаблона - PullRequest
0 голосов
/ 02 ноября 2009

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

У меня есть шаблон класса RGB, который может принимать имена типов в качестве одного из параметров шаблона. Он берет имя типа и отправляет его в другой шаблон, который создает классификацию его основного типа. Например:

struct float_type {};
struct bit_type {};
struct fixed_pt_type {};

template <typename T> struct type_specification { typedef float_type type; };

template <> struct type_specification<char>      { typedef bit_type type; };
template <> struct type_specification<short>     { typedef bit_type type; };
template <> struct type_specification<int>       { typedef bit_type type; };
template <> struct type_specification<long>      { typedef bit_type type; };
template <> struct type_specification<long long> { typedef bit_type type; };

Затем, с этим, у меня есть шаблон, который вычисляет максимальные значения для каждого из значений RGB на основе его счетчика битов:

template <int Bits, typename T> struct Max_Values { enum { MaxValue = (1 << Bits) - 1; }; };
template <int Bits> struct MaxValues<float_type>  { enum { MaxValue = 1.0; }; };

Тогда в реальном классе шаблонов RGB у меня есть:

enum
{
     RMax = Max_Values<RBits, type_specification<T>::type>::MaxValue;
     GMax = Max_Values<GBits, type_specification<T>::type>::MaxValue;
     BMax = Max_Values<BBits, type_specification<T>::type>::MaxValue;
};

Это работает очень хорошо для меня, пока я не попал в потребности с фиксированным pt. Максимальное значение немного отличается, и я не знаю, как создать специализацию спецификации типа, чтобы изолировать ее. Единственный обходной путь, который у меня есть, - это процесс исключения и создания специализаций для чисел с плавающей точкой и двойных чисел, при условии, что общий случай будет фиксированным. Но должен быть лучший способ сделать это. Вот что я хочу сделать с неправильным кодом:

template <> struct type_specification<fixed_pt_t> { typedef fixed_pt_type type; };

Однако fixed-pt-t - это шаблонный класс, который выглядит следующим образом:

template <int N, typename T, template <class> class Policy> struct fixed_pt_t

Так что компилятору не нравится специализация без параметров шаблона.
Есть ли способ специализировать мой класс спецификации типов для работы с fixed-pt-t?
Он отлично работает в общем случае, просто не могу его изолировать.

1 Ответ

3 голосов
/ 02 ноября 2009

Возможно, мне не хватает какого-то более крупного осложнения, но есть ли причина, по которой вы не можете просто частично специализировать шаблон type_specification?

Примерно так:

template <int N, typename T, template <class> class Policy>
struct type_specification< fixed_pt_t<N, T, Policy> >
{
    typedef fixed_pt_type type;
};
...