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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: приведение типов  (Прочитано 4199 раз)
paxerus
Гость
« : Февраль 03, 2010, 12:46 »

Добрый день
У меня простенький вопрос как как корректно привести тип
std::vector<char> к QByteArray (или другому типу QT)
Записан
BRE
Гость
« Ответ #1 : Февраль 03, 2010, 13:00 »

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


« Последнее редактирование: Февраль 03, 2010, 13:02 от BRE » Записан
paxerus
Гость
« Ответ #2 : Февраль 03, 2010, 13:12 »

пасиб большое то что нужно Улыбающийся
Записан
paxerus
Гость
« Ответ #3 : Февраль 03, 2010, 15:51 »

еще маленький вопрос а как  std::vector<unsigned char> преобразовать в std::vector< char>
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Февраль 03, 2010, 16:40 »

А не нужно этого делать, главное - это правильно потом интерпретировать, ИМХО Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Февраль 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];
« Последнее редактирование: Февраль 03, 2010, 18:26 от Igors » Записан
paxerus
Гость
« Ответ #6 : Февраль 04, 2010, 07:21 »

А не нужно этого делать, главное - это правильно потом интерпретировать, ИМХО Улыбающийся
я еслиб мне это надо было потом я б не спрашивал мне нужно именно сразу все Улыбающийся
в принцпи можно и так
TVec * theUVec = (TVec *) &theVec;
оставить, но хотелось бы посмотреть на вариант со static_cast

static_cast я изначально рассматривал но не знаю как правильно написать его,то что написано в теории не работает у меня
кто со static_cast поможет?
« Последнее редактирование: Февраль 04, 2010, 07:24 от paxerus » Записан
BRE
Гость
« Ответ #7 : Февраль 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 ) );
 
Таким костылем, можно привести все что угодно, к чему угодно, и компилятор при этом будет молчать. Поэтому это опасная практика.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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