У меня есть некоторый устаревший код 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 ::? Это возможно, и это путь?