Все
Я создаю универсальный двоичный сериализатор и получил блокировку того, как вставить экземпляр класса в последовательное представление.
Вот пример кода:
#include <iostream>
#include <rttr/type>
#include <rttr/registration.h>
using namespace rttr;
struct Item {
int i ;
};
struct MyTestClass {
std::vector<Item> seq;
};
RTTR_REGISTRATION
{
using namespace rttr;
registration::class_<MyTestClass>("TestClass")
.constructor<>()
.property("seq", &MyTestClass::seq);
registration::class_<Item>("Item")
.constructor<>()
.property("item", &Item::i);
}
void CreateInst(rttr::instance inst) {
auto localobj = inst.get_type().get_raw_type().is_wrapper() ? inst.get_wrapped_instance() : inst;
auto p = localobj.get_type().get_property("item");
p.set_value(inst, 100);
}
int main()
{
MyTestClass inst;
for (auto prop : rttr::type::get_by_name("TestClass").get_properties()) {
auto type = prop.get_type();
if (type.is_sequential_container()) {
auto val = prop.get_value(inst);
auto view =val.create_sequential_view();
view.set_size(1); //just for demo
rttr::variant var = view.get_value_type().create();
CreateInst(var);
//get its wrapped and insert 'it', it will have the correct result
//Item it=var.get_wrapped_value<Item>();
view.set_value(0, var);
prop.set_value(inst, val);
}
}
std::cout << inst.seq[0].i << std::endl;
}
он всегда выводит на экран «0» вместо «100», если только я не получу его обернутое значение и не вставлю. Но это не то, чего я хочу.
Может ли какой-нибудь эксперт помочь мне улучшить это?
Спасибо.
BR Рэй
Хорошо. Наконец, я нахожу решения следующим образом:
registration::class_<Item>("Item")
.constructor<>()(policy::ctor::as_object)
.property("item", &Item::i);
Не забудьте добавить RTTR_DLL в свойствах проекта — C/C++-препроцессор — определение препроцессора, чтобы избежать ошибки LNK2001.