Ich habe diese Funktion ausprobiert, kopiert von https://stackoverflow.com/a/55071840/225186 (gegen Ende),
Code: Select all
template
constexpr std::ptrdiff_t element_offset() {
Tuple p;
return
(char*)(&std::get(*static_cast(&p)))
- (char*)(static_cast(&p))
;
}
Diese Funktion scheint zur Laufzeit gut zu funktionieren, aber ich kann sie zur Kompilierzeit nicht auswerten.
https://godbolt.org/z/MzGxfT1cc
Code: Select all
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)
}
Aber bisher ist es im Grunde die einzige Funktion, die sich als funktionierend erwiesen hat (zur Laufzeit).
Gibt es eine Möglichkeit, diese Funktion so umzuschreiben, dass sie beim Kompilieren ausgewertet werden kann?
Ich habe diese angesprochene Liste auch am Anfang ausprobiert https://stackoverflow.com/a/55071840/225186, aber sie alle liefern Müllergebnisse (zumindest in GCC), weil sie eine bestimmte Reihenfolge der Tupelelemente annehmen und der Offset berechnet wird, indem man Index für Index „durchläuft“ und Bytes ausrichtet.
Mobile version