Хранить тип как переменную? для шаблонного класса? - PullRequest
1 голос
/ 21 декабря 2009

У меня есть шаблонный класс со следующим определением:

ImageRescaleDepth<PIXEL_TYPE_INPUT, PIXEL_TYPE_OUTPUT>

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

1BIT, 2BIT, 4BIT, unsigned 8 bit, signed 8 bit, unsigned 16 bit, signed 16 bit, unsigned 32 bit, signed 32 bit, float, double.

Они передаются в командной строке, и я конвертирую их в перечисление.

Я не могу изменить класс ImageRescaleDepth, поскольку он является частью библиотеки. и я точно не хочу создавать гигантский переключатель или блок eliseif, так как было бы 100 комбинаций. Возможно ли, я могу просто как-то хранить эти типы как переменные? Затем передать их конструктору?

Ответы [ 3 ]

5 голосов
/ 21 декабря 2009

Нет, тип класса шаблона должен быть известен во время компиляции, поэтому типы типов изображений должны быть переданы в шаблон. Я должен сказать, что, если этот класс предназначен для выполнения преобразований между многими различными форматами, использование параметров шаблона для указания смазываний преобразования очень плохого дизайна.

0 голосов
/ 21 декабря 2009

Может быть, использование списков типов может вам помочь. Смотрите, например, boost :: mpl или просто boost / std :: tuple. Этого достаточно, чтобы сгенерировать список всех пар типов из вашего начального списка. Ваш большой переключатель может быть обработан автоматически (т.е. сгенерирован) с помощью рекурсивного метапрограммирования шаблона (я не знаю, есть ли у mpl средства для этого) Однако это не тривиально (я потратил много часов), поэтому, если вам нужно разобраться только с этим одним случаем, может быть быстрее создать код с помощью языка сценариев!

0 голосов
/ 21 декабря 2009

Почему бы не перейти на ООП? Тогда вы можете использовать функцию typeid (), чтобы получить имя типа и динамическое приведение.

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