// алгоритм, относящийся только к одному значению BPP выделяем в шаблон функцииtemplate<int BPP> void YourClass::foo_impl(int2type<BPP> tag, SomePtr rbuf)
{
typedef canvas_traits<BPP> ct;
typedef typename ct::aggpxfmt aggpxfmt;
.....
// возможно, что вместо auto_ptr / shared_ptr достаточно scoped_ptr
scoped_ptr<aggpxfmt> pixf( new aggpxfmt((agg::rendering_buffer&)*rbuf.get()) );
scoped_ptr<renderbase> ren_aa( new renderbase(*pixf) );
scoped_ptr<renderoaa> ren_oaa( new renderoaa(*ren_aa) );
scoped_ptr<rasteroaa> ras_oaa( new rasteroaa(*ren_oaa) );
ras_oaa->add_path(*this);
.....
}
В-третьих, полиморфизм времени исполнения
// все ветвления сделаем единожды в функции-диспетчереvoid YourClass::foo(SomePtr rbuf)
{
switch(m_CanvasBPP)
{
case 3: foo_impl(int2type<3>, rbuf); break;
case 4: foo_impl(int2type<4>, rbuf); break;
}
}
Вместо switch можно завести массив указателей на функции или объекты с виртуальными методами — но это уже по желанию.
Здравствуйте, CheckiSt, Вы писали: AD>> разве полиморфизм на основе виртуальных функций не позволяет решить эту задачу?
CS>Ммм... Получается лишний вызов функции против создания четырёх указателей. Вы считаете, это оправдано?
Если учесть, что я до сих пор не понял о чём речь (в частности, сбивает с толку назвние топика: "Динамическое определение типа?"), то отвечу честно: не знаю
Возникла следующая задача:
1. На отрисовку приходит буфер в формате rgb24 или rgba32 (заранее неизвестно).
2. Для отрисовки пользуемся набором средств, привязанных к формату (типом каждого объекта).
Пока решил дублированием typedef и объектов для разных режимов:
CheckiSt пишет: > ... > Пока решил дублированием typedef и объектов для разных режимов: > ...
Я не особо понял, как это помогает в решении твоей задачи...
Все переменные объявлены как boost::shared_ptr, поэтому фактически память я выделяю только под то, подо что мне нужно. Теперь меня интересует, есть ли более разумное решение.
AD>Если учесть, что я до сих пор не понял о чём речь (в частности, сбивает с толку назвние топика: "Динамическое определение типа?"), то отвечу честно: не знаю
Это всё потому что кто-то бестолково сформулировал тему... Но возможный ход решения Вы подсказали, спасибо
Здравствуйте, Кодт, Вы писали:
К>Во-вторых, полиморфизм времени компиляции К>
К>// алгоритм, относящийся только к одному значению BPP выделяем в шаблон функции
К>template<int BPP> void YourClass::foo_impl(int2type<BPP> tag, SomePtr rbuf)
К>{
К> .....
К>}
К>