2013-08-28 2 views
1

У меня есть const vector<uint8_t>>, и мне нужно передать его функции, которая принимает const unsigned char*. Эти два типа имеют одинаковый размер и т. Д., Поэтому я предполагаю, что здесь есть хороший способ принуждения типов. Каков идиоматический способ решения этой проблемы?Как преобразовать вектор <uint8_t> в unsigned char *

Моим первым инстинктом является использование reinterpret_cast, но после отливки данные не совпадают. Вот мой код:

shared_ptr<const vector<uint8_t>> data = operation.getData(); 
const unsigned char* data2 = reinterpret_cast<const unsigned char*>(&data); 
myFunction(data2, data->size()); 

Скорее всего, я спутал указатель на значение здесь, но, возможно, весь мой подход неверен.

+0

Вернее: 'data-> data()' –

+0

'vector :: data()' возвращает указатель на фактические данные внутри вектора. –

+0

@BenjaminLindley, Почему? Зачем? Я должен сойти с ума. Как на самом деле 'operator->' не приходило в голову? – chris

ответ

4

reinterpret_cast практически никогда не будет правильным решением, если вы не знаете точно, что вы делаете, и даже тогда обычно нет.

В вашем случае, вы просто хотите указатель на прилежащее хранение данных внутри вектора (но не самого вектора, как вы уже заметили! Это хранит другие данные, а также, например, размера & емкости) , Это достаточно просто, это указатель на первый элемент данных:

&vector[0] 

Так что ваш код будет выглядеть следующим образом:

myFunction(&(*data)[0], data->size()); 
+0

Благодарим вас за четкое объяснение. Заметка о reinterpret_cast также запоминается; Я буду держать это далеко от меня, пока не выясню остальные инструменты, которые я нарезал себе :) –

+0

Также можно использовать, а иногда и более читаемо, использование 'std :: vector: : спереди() '. http://en.cppreference.com/w/cpp/container/vector/front –

1

Просто используйте vector<unsigned char>, чтобы начать с. На всех платформах unsigned char будет иметь не менее 8 бит. На платформах с 8-битным беззнаковым интегральным типом uint8_t будет синонимом для unsigned char; на платформах, которые не имеют 8-битного неподписанного интегрального типа, uint8_t не будет существовать, но unsigned char будет.

+0

Не могли бы вы предоставить ссылку для «' uint8_t' будет синонимом 'unsigned char'?? Не может ли это быть typedef для 'char' или даже для расширенного целочисленного типа без знака? – dyp

+0

@DyP - вы правы, 'uint8_t' может быть синонимом' char' с компилятором, который делает 'char'' unsigned'. Если ваш код ** не требует ** ** точного ** 8-битного типа, не используйте 'uint8_t'. Это довольно редкое требование. –

Смежные вопросы