Печать структуры XMacro на консоль с C++
Я играю со структурами и классами, и я увидел действительно классный код, который я хотел попробовать: x-macro.
Мой код разбит на 3 бита: заголовок, x-макрос и основной файл cpp. Программа еще не закончена, и в ней все еще есть покрытие кода и полировка, но я пытаюсь построить структуру с помощью x-макроса, а затем хочу вывести содержимое структуры на экран.
Вот мой х-макрос
#define X_AIRCRAFT \
X(int, Crew) \
X(int, SeatingCapacity) \
X(int, Payload) \
X(int, Range) \
X(int, TopSpeed) \
X(int, CargoCapacity) \
X(int, FuelCapacity) \
X(int, Engines) \
X(int, Altitude) \
X(double, mach) \
X(double, Wingspan)
Вот мой заголовок (сейчас довольно бесплодный)
#include <iostream>
#include <string>
#ifndef X_AIRCRAFT
#include "xmacro.xmacro"
#endif // !
using namespace std;
typedef struct {
#define X(type, name) type name;
X_AIRCRAFT
#undef X
}Public_Airplane;
//Prototypes
void iterater(Public_Airplane *p_a);
Вот мой main()
(Здесь я вырезал кучу кода. В итоге я создал класс Airplane с различными свойствами. Затем я создал три разных подкласса, которые унаследовали свойства Airplane и сделали свои собственные вещи. Поэтому я ' Я вообще не буду публиковать классы, если вы, ребята, не думаете, что моя проблема в этом. Я просто опубликую функцию, которая не работает должным образом...)
#include <iostream>
#include <string>
#include <iomanip>
#include "aircraft.h"
#ifndef X_AIRCRAFT
#include "xmacro.xmacro"
#endif // !
using namespace std;
int main()
{
Public_Airplane p_a;
iterater(&p_a);
system("pause");
return 0;
}
void iterater(Public_Airplane *p_a)
{
//I want to print to screen the contents of my x-macro (and therefore my struct)
#define X(type, name) cout << "Value: = " << name;
X_AIRCRAFT
#undef X
}
Я никогда раньше не работал с макросами, поэтому сейчас пытаюсь это сделать. Но, насколько я понимаю, предварительно обработанный код должен выглядеть примерно так:
int crew;
int SeatingCapacity;
int Payload
int Range;
int TopSpeed;
int CargoCapacity;
int FuelCapacity;
int Engines;
int Altitude;
double mach;
double Wingspan;
cout << "Value: = " << Crew; (and so on down the list).
Что я делаю неправильно, что мешает мне получить вывод кода выше?
1 ответ
В конечном итоге вы хотите сгенерировать код, который выглядит следующим образом:
void iterater(Public_Airplane* p_a) {
cout << "Crew = " << p_a->Crew << endl;
cout << "SeatingCapacity = " << p_a->SeatingCapacity << endl;
...
}
Общий шаблон - распечатать строковое представление имени, затем знак равенства, а затем использовать оператор стрелки для выбора этого члена из класса. Вот один из способов сделать это:
void iterater(Public_Airplane *p_a)
{
#define X(type, name) cout << #name << " = " << p_a->name << endl;
X_AIRCRAFT
#undef X
}
При этом используется оператор строкового преобразования # для преобразования имени в указанную версию самого себя.