Я очень стараюсь сделать эту работу, но мне не повезло. Я уверен, что есть работа, но я еще не сталкивался с ней. Хорошо, давайте посмотрим, смогу ли я описать проблему и потребности достаточно просто:
У меня есть шаблон класса 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?
Он отлично работает в общем случае, просто не могу его изолировать.