Как это случилось, я впервые увидел действительно изящный трюк для этого несколько лет назад.
Идея состоит в том, что вы присваиваете классу именованные переменные по порядку, а затем также получаете static const
член типа массив-указатель-на-член. operator[]
перегружен для поиска соответствующего указателя на член, используйте его для выбора члена из this
и возврата ссылки.
Это работает, потому что указатели на члены не являются обычными указателями; они немного более волшебны, чем это. (Это то, что позволяет создавать неограниченные указатели на функции-члены и почему их нельзя использовать там, где ожидаются простые указатели на функции).
Это также означает, что вам не нужно использовать какие-либо приемы приведения, полагаться на какие-либо виды выравнивания, непереносимое поведение анонимного объединения или гарантии расположения памяти, и вы все равно можете ссылаться на компоненты структуры как именованные поля, а не через функции доступа.