Я работаю над кодом, который получает данные, которые выглядят так:
enum data_type { INT16 = 0, INT32, UINT64, FLOAT, TIMESTAMP };
struct buffer {
data_type element_type;
size_t size; // in elements of element_type, not bytes
void* data;
}
(это упрощенно, на самом деле в этой структуре гораздо больше типов, больше полей и т. д.)
Теперь я обнаружил, что пишу кучу служебного кода для «преобразования» значений перечисления в фактические типы и наоборот во время компиляции. Затем я понимаю, что мне нужно сделать кое-что из того, что мне нужно сделать то же самое во время выполнения, и с переменным количеством буферов... так что теперь, в дополнение к поиску значений на основе типовых признаков и перечислению- Поиск типов на основе параметров шаблона — я пишу код, который ищет std::type_info
s. Это своего рода беспорядок.
Но на самом деле я не должен этого делать. Это повторяется, и я абсолютно уверен, что заново изобретаю велосипед - реализую то, что уже было написано много раз: компиляторы, СУБД, парсеры файлов данных, библиотеки сериализации и так далее.
Что я могу сделать, чтобы свести к минимуму потраченные впустую усилия в этом начинании?
Примечания:
- Я получаю эти буферы во время выполнения и не могу просто отменить удаление типа во время компиляции (например, используя type_traits).
- Я не могу изменить API. Вернее, я мог изменить в своем коде все, что хотел, но я все равно получаю данные в этом макете в памяти.
- Я не просто беру такие буферы на вход, мне также нужно производить их на выходе.
- Иногда мне нужно обрабатывать много разных буферов одновременно - даже переменное их количество (например,
foo(buffer* buffers, int num_buffers);
. - Решения C++11 предпочтительнее, чем более новые стандартные версии.
- На самом деле я часто использую
gsl
, так что вы можете использовать его в своих ответах, если хотите. Что касается Boost, от него может быть политически сложно зависеть, но для целей вопроса StackOverflow, я думаю, это нормально.