Я использую ускоренную сериализацию для сохранения объектов из нескольких выходных файлов архива (xml, двоичный и текстовый). Когда библиотека загружается через указатель, она создает новый объект, и я хочу предотвратить это для некоторых моих объектов, скажем, для моих диалоговых классов. Поэтому я загружаю диалоги со ссылкой. Но код уродлив:
boost::archive::xml_iarchive ia;
for(vector<BaseDialog*>::iterator it= dialogs.begin();it!=dialogs.end();it++)
{
if(typeid(it) == MyDialog1)
{
MyDialog1* dlg = dynamic_cast<MyDialog1*>(it);
ia & (*dlg);
}
if(typeid(it) == MyDialog2)
{
MyDialog2* dlg = dynamic_cast<MyDialog2*>(it);
ia & (*dlg);
}
}
Поэтому я придумал следующее решение:
class BaseDialog
{
public:
virtual void SaveState(boost::archive::xml_oarchive& oa)=0;
virtual void LoadState(boost::archive::xml_iarchive& ia)=0;
virtual void SaveState(boost::archive::binary_oarchive& oa)=0;
virtual void LoadState(boost::archive::binary_iarchive& ia)=0;
// other formats here
};
В моих производных классах я реализую эти функции. И сохранение и загрузка тогда примерно такие:
boost::archive::xml_iarchive ia;
for(vector<BaseDialog*>::iterator it= dialogs.begin();it!=dialogs.end();it++)
it->LoadState(ia);
Итак, для каждого вывода архива у меня есть пара виртуальных функций в классе BaseDialog, что тоже нехорошо.
Так что у кого-нибудь есть идеи, как решить эту проблему