Могу ли я передать & std :: array <> как пустоту *? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть некоторый устаревший код C, который я обернул интерфейсом C ++ для использования нового кода C ++. Код C использовал void * для загрузки данных из файла. Он знал, сколько данных нужно загрузить внутри, на основе тега enum, который вы отправили бы:

bool load_data( TAG_TYPE tag, void* data );

Моя оболочка C ++ выглядит примерно так:

template<typename T>
T load( TAG_TYPE tag ) {
    T data;
    bool success = load_data( tag, &data );
    assert( success );
    return data;
}

Это добавляет некоторую безопасность типов и является более чистым для кода C ++. И мы можем использовать auto & const:

const auto foo = load<int>( TAG_NUM_POINTS );

Теперь кому-то нужно загрузить массив из файла. Они хотели бы использовать std :: array, потому что это C ++.

const auto foo = load<std::array<int, 3>>( TAG_RGB_VALUE );

Это безопасно? Вроде компилируется и работает нормально. Под крышками он будет передавать &std::array<int, 3> в качестве значения data вместо предпочтительного data.data().

Кажется, что это область, в которой я бы хотел специализироваться на шаблонах, но тогда мне нужно было бы добавить параметры шаблона для типа и размера массива std ::? Это возможно, и это путь?

1 Ответ

0 голосов
/ 12 сентября 2018

В std::array<> существует метод, называемый data(). Это позволяет получить доступ к внутренним данным, не беспокоясь о реализации. Подробнее об этом можно прочитать здесь https://en.cppreference.com/w/cpp/container/array/data

Пример

bool load_data( TAG_TYPE tag, void* data );

template<typename T>
std::array<T> load( TAG_TYPE tag ) {
    std::array<T> data;
    bool success = load_data( tag, data.data() );
    assert( success );
    return data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...