Russian Qt Forum
Ноябрь 23, 2024, 02:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удобное использование template  (Прочитано 2389 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Декабрь 12, 2014, 16:03 »

Добрый день

Не очень удачное название топика, ну ладно. Есть либа которая юзается так (упрощенный псевдокод)
Код
C++ (Qt)
template <class T>
void MyLib::Interpolate( const T * src, int numSrc, T * dst, int numDst, int channel);
Это работает, я могу вызывать метод с разными типами аргументов предварительно зарезервировав номер канала channel и узнав numDst. Неудобство в том что я "впадаю в if'ы" при разнородных данных. Напр
Код
C++ (Qt)
// входные данные
std::vector <Color> srcColor;
std::vector <Coord> srcNormal;
std::vector <std::vector <Coord> > srcUV;
 
// выходные данные
std::vector <Color> dstColor;
std::vector <Coord3f> dstNormal;
std::vector <std::vector <CoordUV> > dstUV;
 
Любой входной контейнер может быть пустым - ну значит и соотв. выходной тоже пустой (этого канала нет)/ И начинается не очень красивое месиво с выяснением кто там есть, напр

Код
C++ (Qt)
int channel = 0;
if (srcColor.size()) {   // есть канал color
 // создаем канал 0 и получаем числo выходных данных
 ...
 dstColor.resize(numDst);
 MyLib::Interpolate(&srcColor[0], srcColor.size(), &dstColor[0], numDst, channel++);
}
 
if (srcNormal.size()) {   // есть канал normal
 // создаем канал и получаем числo его выходных данных
 ...
 dstNormal.resize(numDst);
 MyLib::Interpolate(&srcNormal[0], srcNormal.size(), &dstNormal[0], numDst, channel++);
}
...
 
Подобным образом код неприятно дуплится еще в 2 местах. Хотелось бы как-то обобщить чтобы сделать все в 1 цикле, но как?

Спасибо
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Декабрь 12, 2014, 17:30 »

так почему не задать в качестве параметров функции std::vector<T> и в функции уже делать проверку

Код:
template <class T>
void MyLib::Interpolate(const std::vector<T> & source, std::vector<T> & destination, int channel)
{
  if(source.size())
 {
 ...
  destination.resize(source.size());
 }
 ///все что делалось дальше в функции
}

Зачем передавать 5 аргументов если можно 3 (адрес ячейки + размер можно сменить на ссылку на вектор типа Т)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Декабрь 12, 2014, 17:46 »

1) Либа не моя, хотя исходники есть, лазить/менять там будет недешево

2) Приведен псевдокод, реально
Код
C++ (Qt)
template <class T>
void MyLib::Interpolate(T * source, T * destination, int channel);
 
Число эл-тов в source задается в дескрипторе который должен быть заряжен до вызова Interpolate. Там сейчас аналогичная возня

3) Даже в случае полного успеха схлопывается только часть кода (цикла нет)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.135 секунд. Запросов: 23.