#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. Сэр, спасибо, это больше соответствует тому, на что я надеялся. теперь я потенциально мог бы использовать это для всевозможных сценариев, в которых мне понадобились бы имена переменных класса и тому подобное. еще раз очень ценю это. ты сделал мой день. 🙂