Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Теперь мы можем смело переписать наш макрос.
отлаживать такой код очень затруднительно
#define SIMPLE_MACRO(text) text
SIMPLE_MACRO( vector<int> v(1, 2) ); // OK
SIMPLE_MACRO( vector<int> v{1, 2} ); // Error, 2 arguments
SIMPLE_MACRO( array<int, 10> ar ); // Error, 2 arguments
SIMPLE_MACRO( [x, y](){} ); // Error, 2 arguments
Слабенькие в плюсах макросы, жалко, что их не улучшают.template<class T>
void Serialize(const string& _key, vector<string, Widget*>* _widgets, pugi::xml_node& _node)
{
auto lv_Node = _node.append_child(_key.c_str());
int i = 0;
for (auto lv_Widget : *_widgets)
{
lv_Widget->Serialize( lv_Node.append_child( inttostr(i++) ) );
}
}
lv_Node.append_attribute("type") = Widget->Type();
_widgets[i] = CreateWidget( lv_Node.attribute("type").as_string() );
и это без удаленных соответствующих конструкторов и операторов.
Я уже молчу про неинициализированные фиктивные члены класса
В исходниках все соответствующие конструкторы и операторы спрятаны, просто не стал писать в статью чтобы кода было не так много.
В смысле неинициализированные?
class Test
{
public:
int SomeInt = 666;
float SomeFloat = 42.2;
string SomeString = "Hello My Little Pony";
void Serialize() {
::Serialize("SomeInt", SomeInt);
::Serialize("SomeFloat", SomeFloat);
::Serialize("SomeString", SomeString);
}
};
class Test
{
public:
int SomeInt = 666;
float SomeFloat = 42.2;
string SomeString = "Hello My Little Pony";
private:
static constexpr std::tuple<...> serialization_info { &Test::SomeInt, "SomeInt",
&Test::SomeFloat, "SomeFloat",
&Test::SomeString, "SomeString" };
};
для каждого экземпляра класса при создании выполняется дополнительный runtime код и тратится уйма памяти.
лишь красивый синтаксис и отсутствие повторов.
то подумайте над каким-нибудь таким решением: для каждого класса храним статическую переменную-tuple, в которой лежат имена и указатели на члены данных (pointer-to-member), что-нибудь вида:
Как я понимаю, к каждому объекту, который мы хотим сериализовать, мы должны добавить соответствующие методы?
А в плюсах есть статическая информация о классе, которую можно получить в runtime?
Сериализация и С++11