Здравствуйте, adontz, Вы писали:
MS>>Никто не мешает сделать такой препроцессор, который бы обрабатывал "вкрапления" IDL в C++ файлы. Но это тоже не хорошо. Вообще, в глобальном смысле, надо разделять функциональность, хоть это и ох как нелегко бывает. Алгоритическая часть никак не должна зависеть от той, которая занимается сериализацией данных.
A>Вот поэтому сериализация помечается в описании (declaration) класса и никаких проблем
A>Тут ведь и инертность публики важна. Если я скажу, что у меня есть супер-пупер сериалайзер для Си++, но вам нужно ещё один язык (пусть даже на что-то похожий) то меня пошлют на... и будут правы.
Это как посмотреть... Вот пример из моего проекта:
аффинные 2D преобразования. Матрицу иногда сериализовать надо? Надо. Но я категорически против того, чтобы помечать этот класс некой крокозяблой и таким образом
изначально ставить его в зависимость от какой-то там левой сериализации (хоть своей, хоть чужой — не важно). Сериализация этого класса должна выполняться где-то извне его, например, при помощи другого класса, типа serializable_affine_matrix. Более того, для одного и того же класса trans_affine может быть несколько сериализаторов — один сохраняет данные в double, другой — во float, третий — вообще в int32 в формате 16.16. Для четвертого типа может быть вполне достаточно int16 формата 10.6. Для пятого — может быть надо сериализовать только матрицу 2x2 — поворот и масштабирование, без трансляции. В идеале, я должен уметь пользоваться сериализатором следующим образом:
class serializable_affine_matrix : public serializable<trans_affine>
{
serializable_affine_matrix(trans_affine& obj)
: serializable<trans_affine>(obj)
{
// accessor modifier
serialize(obj::get_mtx00, obj::set_mtx00);
serialize(obj::get_mtx01, obj::set_mtx01);
serialize(obj::get_mtx10, obj::set_mtx10);
serialize(obj::get_mtx11, obj::set_mtx01);
serialize(obj::get_mtx20, obj::set_mtx21);
}
};
Более того, класс (как тот же trans_affine) может вообще не иметь аксессоров и модификаторов в явном виде. У него есть методы load_from(const double* m6) и store_to(double* m6). Эту ситуацию тоже надо уметь разрулить через некий промежуточный буфер.