Как я уже сказал в комментарии.Да, нет проблем с построением из архива.(Другая альтернатива - использовать функцию static load
, но это может привести к снижению производительности.)
Единственная потенциальная проблема, которую я вижу в вашем подходе, заключается в том, что ваш конструктор может принимать почти все в качестве аргумента и может создавать проблемы.И это может помешать конструктору копирования и другим конструкторам с одним аргументом, полагающимся на неявное преобразование.
Таким образом, нужно ограничиться только получением архивов.
Существуют различные методы, чтобы сделать это, но основанные нав этом разговоре http://marc.info/?l=boost&m=121131260728308&w=2, и тем фактом, что дерево наследования archives
является задокументированным http://www.boost.org/doc/libs/1_35_0/libs/serialization/doc/class_diagram.html, Я думаю, что это лучшее решение - проверить, что аргумент полученот basic_iarchive
.
#include<type_traits>
struct Foo {
...
std::vector<int> data;
Foo() {
// populate "data" by doing calculation
data.push_back(1); data.push_back(2);
}
template<class IArchive,
typename = std::enable_if_t<std::is_base_of<boost::archive::detail::basic_iarchive, IArchive>::value>>
Foo( IArchive & ar ) {
ar >> data;
// populate "data" by reading the archive
}
...
};
int main(int argc, const char *argv[])
{
// deserialize
boost::archive::text_iarchive iar(std::cin);
Foo foo(iar); // will also work with other archives
}
Что касается того, что происходит, когда ваши данные не являются конструктивными по умолчанию, см. обсуждение выше.