Konwersja wektora danych do danych binarnych danego typu

0

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.

  1. 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ć?
  1. 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ę?

0
_13th_Dragon napisał(a):

http://doc.qt.io/qt-4.8/qdatastream.html

Zapoznałem się z tym linkiem i ma się trochę to nijak do problemu... :(

0

Czyli nie widzisz że to zastępuje twoją funkcje convert?

1 użytkowników online, w tym zalogowanych: 0, gości: 1