Wie kann der Offset eines Elements eines Tupels zur Kompilierungszeit bestimmt werden?C++

Programme in C++. Entwicklerforum
Anonymous
 Wie kann der Offset eines Elements eines Tupels zur Kompilierungszeit bestimmt werden?

Post by Anonymous »

Ich muss den Offset eines bestimmten indizierten Elements eines Tupels zur Kompilierung-Zeit ermitteln.
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))
;
}
einschließlich Varianten, in denen ich p eliminiere und &p durch nullptr ersetze.
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)
}
Ich verstehe, dass dies wahrscheinlich daran liegt, dass die reinterpret_casts nicht zur Kompilierungszeit durchgeführt werden können.
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post