Страницы

Поиск по вопросам

понедельник, 8 октября 2018 г.

Перечисление полей структуры

Есть структура и функции:
struct S { T1 t1; T2 t2; // и т.д. } s;
template f(const T& t, const char* name) { /* что-то */ }
Необходимо, чтобы работал следующий (псевдо)код:
for (поле : поля(s)) f(поле.значение, поле.имя);
То есть, надо как-то перечислить все поля структуры, получая их тип, значение и имя в виде строки.
Я знаю, что рефлексии в языке C++ нет. Но здесь не нужна рефлексия при выполнении, нужна рефлексия на стадии компиляции или линковки. При этом можно как угодно извращаться с объявлением структуры S, но нельзя трогать функцию f. Но в итоге всё равно должна быть каким-либо образом создана либо структура либо что-то структурообразное, поволяющее обращаться к полям (s.t1 и т.д.).
Сторонние библиотеки использовать нельзя, но можно использовать макросы, шаблоны и вообще все доступные возможности C++14


Ответ

Как предложил в комментариях к вопросу @KoVadim, можно использовать так называемые X Macro. С их использованием Ваша задача решается примерно следующим образом:
#include
#define STRUCT_FIELDS \ X(int, i) \ X(float, f) \ X(const char*, c)
struct S { #define X(type, name) type name; STRUCT_FIELDS #undef X };
template void f(const T& t, const char* name) { std::cout << name << " = " << t << std::endl; }
void printStruct(const S& s) { #define X(type, name) f(s.name, #name); STRUCT_FIELDS #undef X }
int main(int argc, char* argv[]) { S s; s.i = 1; s.f = 10.1; s.c = "s";
printStruct(s); }
Результат работы программы:
i = 1 f = 10.1 c = s

Комментариев нет:

Отправить комментарий