Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Декабрь 12, 2014, 16:03



Название: Удобное использование template
Отправлено: Igors от Декабрь 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 цикле, но как?

Спасибо


Название: Re: Удобное использование template
Отправлено: Fregloin от Декабрь 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 (адрес ячейки + размер можно сменить на ссылку на вектор типа Т)


Название: Re: Удобное использование template
Отправлено: Igors от Декабрь 12, 2014, 17:46
1) Либа не моя, хотя исходники есть, лазить/менять там будет недешево

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

3) Даже в случае полного успеха схлопывается только часть кода (цикла нет)