2015-10-30 4 views
4

Я получаю массив из C API, и я хотел бы скопировать его в std :: array для дальнейшего использования в моем коде на C++. Итак, каков правильный способ сделать это?Правильный способ инициализации std :: array из массива C

I 2 использует для этого один:

struct Foo f; //struct from C api that has a uint8_t kasme[32] (and other things) 

c_api_function(&f); 
std::array<uint8_t, 32> a; 
memcpy((void*)a.data(), f.kasme, a.size()); 

И это

class MyClass { 
    std::array<uint8_t, 32> kasme; 
    int type; 
public: 
    MyClass(int type_, uint8_t *kasme_) : type(type_) 
    { 
     memcpy((void*)kasme.data(), kasme_, kasme.size()); 
    } 
    ... 
} 
... 
MyClass k(kAlg1Type, f.kasme); 

Но это чувствует себя довольно неуклюжим. Есть ли идиоматический способ сделать это, что, по-видимому, не связано с memcpy? Для MyClass, возможно, мне лучше с конструктор, принимающий std :: массив, который перемещается в член, но я тоже не могу понять, как это сделать. ?

+3

Почему не 'зЬй :: copy'? – 101010

+1

за исключением того, что он еще не является официальным: 'auto x = std :: to_array (cArrayPtr);' – David

ответ

5

Вы можете использовать алгоритм std::copy, указанный в заголовке <algorithm>. Например

#include <algorithm> 
#include <array> 

//... 

struct Foo f; //struct from C api that has a uint8_t kasme[32] (and other things) 

c_api_function(&f); 
std::array<uint8_t, 32> a; 
std::copy(f.kasme, f.kasme + a.size(), a.begin()); 

Если f.kasme действительно массив, то вы также можете написать

std::copy(std::begin(f.kasme), std::end(f.kasme), a.begin()); 
+0

@ binary01 Это моя ошибка. :) Я удалил эту часть сообщения. :) –

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