Как определить смещение элемента кортежа во время компиляции?C++

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

Сообщение Anonymous »

Мне нужно определить смещение определенного индексированного элемента кортежа во время компиляции.
Я попробовал эту функцию, скопированную из https://stackoverflow.com/a/55071840/225186 (ближе к концу),

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

template 
constexpr std::ptrdiff_t element_offset() {
Tuple p;
return
(char*)(&std::get(*static_cast(&p)))
- (char*)(static_cast(&p))
;
}
включая варианты, в которых я исключаю p и заменяю &p на nullptr.
Эта функция, кажется, работает хорошо во время выполнения, но я не могу оценить ее во время компиляции.
https://godbolt.org/z/MzGxfT1cc

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

int main() {
using Tuple = std::tuple;
constexpr std::size_t index = 3;
constexpr std::ptrdiff_t offset = element_offset();  // ERROR HERE, cannot evaluate constexpr context

Tuple t;
assert(( reinterpret_cast(&t) + offset == reinterpret_cast(&std::get(t))  ));  // OK, when compiles (without "constexpr" offset)
}
Я понимаю, что это, вероятно, связано с тем, что reinterpret_cast не может быть выполнено во время компиляции.
Но пока это, по сути, единственная функция, которая доказала свою работоспособность (во время выполнения).
Есть ли способ переписать эту функцию таким образом, чтобы ее можно было оценить при компиляции?
Я также попробовал этот список подходов в начале https://stackoverflow.com/a/55071840/225186, но все они дают мусорные результаты (по крайней мере, в GCC), поскольку предполагают определенный порядок элементов кортежа, а смещение рассчитывается путем "прогулки" индекса по индексу и выравнивания байтов.

Подробнее здесь: https://stackoverflow.com/questions/706 ... mpile-time
Ответить

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

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

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

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

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