данных сопоставить числовые значения с возможностью после восстановить по значению этот тип.
В целом ничего особо сложного:
template<size_t>
struct id_to_type;
constexpr size_t int_id = 1;
template<>
struct id_to_type {
using type = int;
};
Проблема тут возникает, когда дело доходит до массивов. Неясно, как протащить информацию о размере массива:
template<size_t>
constexpr size_t id_char_array = 2;
template<??>
struct id_to_type<id_char_array<N>> {
using type = char[N];
};
Возможно ли это как-то сделать?
Пробовал идентификатор заворачивать в структуру
template<size_t id, size_t size = 1>
struct id_holder {
static constexpr size_t value = id;
};
А затем специализировать уже для неё:
template<size_t N>
struct id_to_type<id_holder<id_char_array<N>, N> {
using type = char[N];
};
Но к успеху не привело, N всегда 1 :(
не очень понятно как это планируется использовать
Если это принципиально важно, то делается либа для маршаллинга В аргументы шаблона класса загоняются вот эти самые идентификаторы: Marshaller<id_int, id_char_array<10>> m(...) Почему идентификаторы, а не сами типы? Потому что планируется передача атрибутов вместе с ними как-то так: Marshaller<id_int | attr_awesome> А передавать атрибуты в конструктор как-то особо не хочется, так как это менее гибкая конструкция (есть свои нюансы в недрах реализации)
но всё таки что мешает первым параметром просто тип принять, вместо этих костылей) а атрибуты передать отдельно
Это размер кода внутреннего увеличивает( А это не очень приятно Ну кроме того, передавая что-то, приятнее написать просто это что-то, а не пару из него и атрибутов (иначе не написать вариадик конструктор): Marshaller<...> m(..., data, ...); vs Marshaller<...> m(..., std::make_pair(data, attrs), ...);
Marshaller<id_int | attr_awesome> я не думаю что это будет работать
Обсуждают сегодня