С++14 (больше не поддерживает компилятор :( ). У меня есть некий массив памяти, статически выделенный, и я хочу в нём разместить свои данные, зная размер всех данных. После этого я хочу на определенные поля этого массива заводить ссылки, и, чтобы эти ссылки можно было брать в compile-time.
struct Record {
void* data;
uint16_t size;
};
uint8_t mempool[200] = {0};
constexpr const Record db_data[] = {
{&(mempool[0]), 4},
{&(mempool[4]), 2},
};
template<int id>
constexpr const int& get_readonly_int()
{
return *static_cast<int*>(db_data[id].data);
}
constexpr const int& test_int = get_readonly_int<0>();
constexpr ругается, что static_cast из void* он не может сделать. если в последней строке constexpr убрать, то работает.
Как можно было бы обойти это ограничение? пытался делать
Record
::data указателем uint8_t* или union {uint8_t*, int*}, но всё это также не срабатывает.
Ссылка в компайл-тайм — это просто переменная-ссылка (или указатель), инициализированная определённым адресом. Массив памяти — это экземпляр твоей структуры с данными, объявленный как глобальная переменная. Всё.
Тебе шаблоны не нужны. constexpr не нужен.
Нельзя реинтерпретировать произвольные байты в constexpr. Для этого в C++20 завезли std::bit_cast, а ранее - только страдать (или писать вручную через побитовые операции)
ну я выкинул лишнее, чтобы пример читабельным был. Конечно у меня сложнее применение. И шаблон там использую, чтобы static_assert использовать.
Понятно. буду что-то ещё придумывать.
А объясни, зачем тебе пыжиться и размещать твои структуры Record именно в uint8_t mempool[200] ? Почему бы просто не объявить массив твоих этих Record и успокоиться?
Обсуждают сегодня