Как структурировать объявление класса и определить его?

#c #serialization #reflection #macros

Вопрос:

Мне нужно преобразовать объявление класса в строку, и мне также нужен определенный класс. в приведенном ниже коде я привел пример, который приводит к Identifier Person is undefined или Incomplete type not allowed . но если это возможно с помощью пользовательских макросов, мы были бы очень признательны за некоторый код.

 struct Person;
std::string Person::meta = STRINGIFY(
    struct Person{
        static std::string meta;
        std::string name = "Test";
        int age = 5;
        std::string address = "No:35179 Address";
    };
);
Person person;
 

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

1. Пожалуйста, не добавляйте языковые теги для несвязанных языков. Это явно не код на языке Си.

2. Что такое STRINGIFY() ? Откуда у тебя этот макрос?

Ответ №1:

Вы не можете этого сделать; вы не можете инициализировать Person::meta до определения типа, и вы не можете определить тип как часть выражения инициализации.

Однако вы можете переместить инициализацию в макрос:

 #define WITH_META(cls, body) struct cls body; std::string cls::meta = "struct " #cls #body;

WITH_META(Person, {
        static std::string meta;
        std::string name = "Test";
        int age = 5;
        std::string address = "No:35179 Address";
    });

int main()
{
    std::cout << Person::meta << std::endl;
}

 

Выход:

 struct Person{static std::string meta; std::string name = "Test"; int age = 5; std::string address = "No:35179 Address";}
 

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

1. Сэр, спасибо, это больше соответствует тому, на что я надеялся. теперь я потенциально мог бы использовать это для всевозможных сценариев, в которых мне понадобились бы имена переменных класса и тому подобное. еще раз очень ценю это. ты сделал мой день. 🙂