Russian Qt Forum

Qt => Общие вопросы => Тема начата: paxerus от Февраль 03, 2010, 12:46



Название: приведение типов
Отправлено: paxerus от Февраль 03, 2010, 12:46
Добрый день
У меня простенький вопрос как как корректно привести тип
std::vector<char> к QByteArray (или другому типу QT)


Название: Re: приведение типов
Отправлено: BRE от Февраль 03, 2010, 13:00
QVector<T> QVector::fromStdVector ( const std::vector<T> & vector )   [static]
А вообще есть много вариантов это сделать для разных контейнеров, использую указатель на данные и их размер.




Название: Re: приведение типов
Отправлено: paxerus от Февраль 03, 2010, 13:12
пасиб большое то что нужно :)


Название: Re: приведение типов
Отправлено: paxerus от Февраль 03, 2010, 15:51
еще маленький вопрос а как  std::vector<unsigned char> преобразовать в std::vector< char>


Название: Re: приведение типов
Отправлено: kuzulis от Февраль 03, 2010, 16:40
А не нужно этого делать, главное - это правильно потом интерпретировать, ИМХО :)


Название: Re: приведение типов
Отправлено: Igors от Февраль 03, 2010, 18:24
Давайте не путать "приводить тип" и "конвертировать". То что показал BRE правильно и будет работать но это никакого отношения к "приведению" не имеет, просто из одного контейнера копируется в другой, имеете 2 контейнера. "Приведение" означает использование физически тех же данных но с др.типом. Привести можно так

Код:
typedef std::vector <char> TVec;
std::vector <unsigned char> theVec;
...
TVec * theUVec = (TVec *) &theVec;

// или так
TVec & theUVec = (TVec &) theVec;

или то же самое но "по теории"
Код:
TVec * theUVec =  static_cast<TVec *> (&theVec);

Но смотрится это неважно  :) Как сказал kuzulis, проще и лучше приводить данные "по месту", напр.

Код:
char с =  (char) theVec[0];


Название: Re: приведение типов
Отправлено: paxerus от Февраль 04, 2010, 07:21
А не нужно этого делать, главное - это правильно потом интерпретировать, ИМХО :)
я еслиб мне это надо было потом я б не спрашивал мне нужно именно сразу все :)
в принцпи можно и так
TVec * theUVec = (TVec *) &theVec;
оставить, но хотелось бы посмотреть на вариант со static_cast

static_cast я изначально рассматривал но не знаю как правильно написать его,то что написано в теории не работает у меня
кто со static_cast поможет?


Название: Re: приведение типов
Отправлено: BRE от Февраль 04, 2010, 08:06
static_cast я изначально рассматривал но не знаю как правильно написать его,то что написано в теории не работает у меня
кто со static_cast поможет?
В теории такого не написано! Почитай, что говорит стандарт по поводу static_cast.
static_cast<T>( x ) это не тоже самое, что (T)x.
Такое преобразование возможно сделать, только с использованием костылей, типа приведения сначала к void*, что полностью ломает контроль типов.
Код
C++ (Qt)
std::vector<unsigned char> vec;
std::vector<char> &cast_vec = *static_cast<std::vector<char> *>( static_cast<void *>( &vec ) );
 
Таким костылем, можно привести все что угодно, к чему угодно, и компилятор при этом будет молчать. Поэтому это опасная практика.