2015-10-19 2 views
1

В настоящее время я регистрирую и сериализую некоторые классы с помощью Boost. Используя следующий код для каждого класса:BOOST: ссылка экспортированного класса со строкой

BOOST_CLASS_EXPORT(Namespace::ClassName) 

Теперь мой вопрос, есть ли возможный способ ссылаться на этот класс с пространством имен :: ИмяКласс поэтому я могу импортировать/использовать/найти класс снова? До сих пор мой поиск в Boost Documentation не принес никаких результатов. Благодаря

EDIT:

При попытке коды из sehe следующей ошибки происходит:

Причина: Исключение импульса было поднято: На /usr/include/boost/serialization/factory.hpp:38 в функция T * boost :: serialization :: factory (__ va_list_tag *) [с T = Namespace :: ClassName; Int N = 0] следующее выражение evaluted ложь: ложь

Backtrace:

1  0x7fae7fbb7528 boost::assertion_failed(char const*, char const*, char const*, long) + 275 
2    0x743147 Namespace::ClassName* boost::serialization::factory<Namespace::ClassName, 0>(__va_list_tag*) + 37 
3    0x739bc5 boost::seri 

ответ

1

Я был в состоянии собрать это вместе с

Live On Coliru

#include <boost/archive/text_oarchive.hpp> 
#include <boost/serialization/export.hpp> 
#include <boost/serialization/base_object.hpp> 
#include <boost/serialization/serialization.hpp> 

struct Base { 
    virtual ~Base() = default; 
    template <typename Ar> void serialize(Ar&, unsigned) { } 
}; 

struct MyStruct : Base { 
    template <typename Ar> void serialize(Ar& ar, unsigned) { ar & boost::serialization::base_object<Base>(*this); } 
}; 

#if 1 
    BOOST_CLASS_EXPORT_GUID(Base , "98e8e3ea-a14a-4875-89d9-6dc58e10002c") 
    BOOST_CLASS_EXPORT_GUID(MyStruct, "97e71ba2-8cb9-45b4-803f-809676925e5c") 
#else 
    BOOST_CLASS_EXPORT(Base) 
    BOOST_CLASS_EXPORT(MyStruct) 
#endif 

BOOST_SERIALIZATION_FACTORY_0(MyStruct) 

int main() { 
    using namespace boost::serialization; 

    std::string s = guid<MyStruct>(); 
    std::cout << s << "\n"; 

    extended_type_info const* eti = extended_type_info::find(s.c_str()); 

    Base* p = static_cast<MyStruct*>(eti->construct()); 
    std::cout << std::boolalpha << (!!p) << "\n"; 
} 

Печать:

97e71ba2-8cb9-45b4-803f-809676925e5c 
true 

Или (if you change #if 1 to #if 0):

MyStruct 
true 
+0

Это, кажется, работает частично, как я могу найти extendet_type_info и, кажется, правильно оценить , Хотя при построении класса я получаю исключение форсирования См. Редактирование в вопросе – Lenny

+0

Мне любопытно, какие части еще не работают – sehe

+0

По какой-то причине, хотя фабрика определена. он по-прежнему использует случай по умолчанию, который по реализации ничего не делает. Следовательно, я получаю сообщение, что выражение оценивается как false. – Lenny

Смежные вопросы