Witam!
Potrzebowałem funkcji, która z wektora double przepisze dane do tablicy bajtów z określonym typem.
Powstało coś takiego:
#include <QByteArray>
#include <QVector>
#include <QDebug>
template <class T>
int convert(QByteArray &out, const QVector<double> &data, double gain = 1){
int outSize = data.size()*sizeof(T);
out.reserve(outSize);
out.resize(outSize);
T * out_ptr = (T*)out.data();
for(int i=0; i<data.size(); ++i)
out_ptr[i] = data[i] * gain;
return 0;
}
int main()
{
// przykladowe dane
QVector<double> data(128);
for(int i=0; i<data.size(); ++i)
data[i] = i*2;
QByteArray out;
convert<short>(out, data);
qDebug() << "Data size: "<<data.size()*sizeof(double);
qDebug() << "Outp size: "<< out.size()*sizeof(short);
return 0;
}
Przykładowe wykorzystanie, to wrzucenie danych na głośnik, gdzie jest przyjmowany np. typ 16bit ze znakiem w formie QByteArray.
Teraz muszę troszkę przerobić funkcję, aby była uniwersalna.
- Przyjmuje QVector, dowolnego typu, czyli np.
- QVector<int>
- QVector<char>
- itp..
Mógłbym napisać funkcje dla każdego typu, lecz wolałbym coś uniwersalnego, żeby przyjmowała wszystko na klatę, bo i tak algorytm zostaje ten sam.
Jak to zrobić?
- Pojawił się problem, gdy typ jest wybierany przez pole w aplikacji, np. QComboBox. Powstała nakładka:
int convert(QByteArray &out, const QVector<double> &data, const QString &type, double gain = 1){
if(type == "double")
return convert<double>(out, data, gain);
if(type == "short")
return convert<short>(out, data, gain);
if(type == "int")
return convert<int>(out, data, gain);
return -1;
}
/* ... */
// wykorzystanie
convert(out, data, "short");
Jeśli jest kilka różnych funkcji do konwertowania, pojawi się problem, bo wszędzie trzeba będzie robić nakładki, wolałbym coś w stylu:
QString nazwa("int"); // <- tekst może pochodzić z GUI
convert<dawaj_typa(nazwa)>(out, data);
// i jeszcze fajniej:
dawaj_typa(nazwa) zmienna_typu_nazwa = 2;
// prędzej będzie się dało użyć w jakiś sposób templaty:
dawaj_typa<nazwa> zmienna_typu_nazwa = 2;
Jak to zrobić?
Panowie, da radę?