@ryzhikovas

Частичная специализация шаблона класса: как грамотно реализовать?

Есть класс ImageType, который определяет битность и число каналов изображения (используется в качестве шаблонного параметра изображения).
template <class ChannelUnit, uint channels = 1>
class ImageType {
public:
	struct PixelDefine {
		typedef void Pixel;
	};
	typedef typename ChannelUnit ChannelUnit;
	const static uint channelsCount = channels;
};

Для хранения различных типов Pixel применяется специализация этого класса. Пример для одноканального восьмибитного изображения:
template <>
struct ImageType<BYTE, 1>::PixelDefine  {
	typedef BYTE Pixel;
};


Реализация полной специализации для всех возможных типов излишне загромождает код. Хотелось бы сделать что-то вроде
template <class ChannelUnit>
struct RGB {
	ChannelUnit _1, _2, _3;
};
..
template <class ChannelUnit>
struct ImageType<ChannelUnit, 3>::PixelDefine  {
	typedef RGB<ChannelUnit> Pixel;
};


К сожалению, такие фокусы компилятор уже не пропускает. Вопрос к знающим людям - как реализовать желаемое правильно?
  • Вопрос задан
  • 3553 просмотра
Решения вопроса 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Посмотрите эту статью, там расписано применение частичной специализации.

Как-то так это можно сделать:
template<typename Chan,size_t cnt> class pixel
{
    std::array<Chan,cnt> data;
};

template<typename Pixel> class Image
{
    std::vector<Pixel> data;
};


В целом, моя идея состоит в отказе от частичной специализации и применении обобщений.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ErmIg
@ErmIg
Программист
Можно посмотреть пример аналогичной библиотеки: BOOST::GIL. Может быть даже им и воспользоваться.

P.S. Хотя, толку от всех этих шаблонов не так много, как хотелось бы, больше проблем. На данный момент Boost::Gil мы уже не используем, есть собственный велосипед для работы с изображениями.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы