Печать структуры 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
}

При этом используется оператор строкового преобразования # для преобразования имени в указанную версию самого себя.

Другие вопросы по тегам