Я попробовал эту функцию, скопированную из 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))
;
}
Эта функция, кажется, работает хорошо во время выполнения, но я не могу оценить ее во время компиляции.
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)
}
Но пока это, по сути, единственная функция, которая доказала свою работоспособность (во время выполнения).
Есть ли способ переписать эту функцию таким образом, чтобы ее можно было оценить при компиляции?
Я также попробовал этот список подходов в начале https://stackoverflow.com/a/55071840/225186, но все они дают мусорные результаты (по крайней мере, в GCC), поскольку предполагают определенный порядок элементов кортежа, а смещение рассчитывается путем "прогулки" индекса по индексу и выравнивания байтов.
Подробнее здесь: https://stackoverflow.com/questions/706 ... mpile-time
Мобильная версия