Управление однородными целочисленными массивами. Какие альтернативы?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Управление однородными целочисленными массивами. Какие альтернативы?

Сообщение Anonymous »

Мне нужно сохранить и обработать последовательность чисел, но тип данных может варьироваться между uint8_t , uint16_t и uint32_t . Тип определяется во время выполнения и полностью вне моего контроля. Т.е. Попытка скопировать в uint32_t* данных в вектор, удерживающее uint16_t .
Пример
Вот упрощенный пример, где я пытаюсь копировать данные в std :: vector , но он не обобщается хорошо: p> p> p> p> p> p> pre -vector , но он не обобщается:
pre wetry: p> p> pre -vector , но он не обобщается. class = "lang-cpp prettyprint-override">

Код: Выделить всё

class DataContainer {
public:
std::vector indices;
};
< /code>
switch(indexType) {
case 1: // uint8_t
const uint8_t* data_u8;
data_u8 = reinterpret_cast(data);
std::memcpy(indices.data(), data_u8, count * sizeof(uint8_t));
break;
case 2: // uint16_t
const uint16_t* data_u16;
data_u16 = reinterpret_cast(data);
std::memcpy(indices.data(), data_u16, count * sizeof(uint16_t));
break;
case 4: // uint32_t
const uint32_t* data_u32;
data_u32 = reinterpret_cast(data);
std::memcpy(indices.data(), data_u32, count * sizeof(uint32_t));
break;
default:
printf("Unsupported index type %d\n", indexType);
return false;
}
Возможные решения, которые я рассматриваю

[*] Использование std :: variant для хранения различных типов
  • обеспечивает безопасность типа, но требует STD :: std () Это также не позволяет мне просто делать indicse.size () net indicse.data () , по крайней мере, не то, что я знаю?

    Код: Выделить всё

    #include 
    #include 
    #include 
    
    using IndexBuffer = std::variant;
    
    class DataContainer {
    public:
    IndexBuffer indices;
    };
    < /code>
    
       хранение всего как std :: vector  < /code> < /strong> < /p>
    
    uint8_t
    и uint16_t ) до uint32_t для простоты.
  • ненужное потребление памяти
Поддерживая отдельные векторы для каждого типа (не идеально) Resort ... < /li>
< /ul>
< /li>
< /ol>
class DataContainer {
public:
std::vector indices_u8;
std::vector indices_u16;
std::vector indices_u32;
};
< /code>
Как лучше всего справиться с этим? Есть лучшие альтернативы?


Подробнее здесь: https://stackoverflow.com/questions/795 ... ternatives
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»