Я почти уверен, что ответ таков: «вы не можете использовать шаблоны, вы должны использовать виртуальные функции (динамический полиморфизм)», но мне кажется, что если бы я пошел по этому пути, мне пришлось бы дублировать много кода,Вот настройка:
В настоящее время у меня есть два класса, ColorImageSegmentation и GrayscaleImageSegmentation.По сути, они делают одно и то же, но есть три различия - они работают с разными типами (ColorImage и GrayscaleImage) - параметр, размерность гистограммы (3 против 1) различна - функция PixelDifference различается в зависимости от типа изображения
Если бы я создал класс
template <TImageType>
class ImageSegmentation
{
};
, я был бы в хорошей форме.Однако я хочу, чтобы этот объект был членом другого класса:
class MyMainClass
{
ImageSegmentation MyImageSegmentation;
};
Но пользователю необходимо определить тип MyImageSegmentation
(если пользователь открывает изображение в градациях серого, я хочу создать экземпляр MyImageSegmentation<GrayScaleType>
. Аналогично для цветного изображения MyImageSegmentation<ColorType>
.)
С производными классами я мог бы сохранить указатель и затем сделать:
class MyMainClass
{
ImageSegmentation* MyImageSegmentation;
};
... user does something...
MyImageSegmentation = new ColorImageSegmentation;
но как бы я сделал что-то подобноес шаблонами?Проблема в том, что у меня много таких вещей:
typedef TImageType::HistogramType HistogramType;
typedef TImageType::PixelType PixelType;
, поэтому я не знаю, как бы преобразовать их в динамическую полиморфную модель без дублирования всего набора кода.
Извините за бессвязные ... кто-нибудь есть какие-либо предложения для меня?
Спасибо,
David