1. Person类型头文件
#ifndef PERSON_H
#define PERSON_H #include <rttr/type> namespace World
{class Person{public:Person();~Person();void set_name(const std::string& name);const std::string& get_name() const;void set_age(int age);int get_age();virtual void show();void growupTo(int age=20); private:std::string m_name;int m_age;RTTR_ENABLE()};
}#endif // PERSON_H
2. Person类型源文件
#include <iostream>
#include <rttr/registration> #include "Person.h"namespace World
{RTTR_REGISTRATION{rttr::registration::class_<Person>("World::Person").constructor<>()(rttr::policy::ctor::as_std_shared_ptr).property("name", &Person::get_name, &Person::set_name).property("age", &Person::get_age, &Person::set_age).method("show", &Person::show).method("growupTo", &Person::growupTo)(rttr::default_arguments(18),rttr::parameter_names("age"));}Person::Person():m_age(0){} Person::~Person(){}void Person::set_name(const std::string& name){m_name = name;}const std::string& Person::get_name() const{return m_name;}void Person::set_age(int age){m_age = age;}int Person::get_age(){return m_age;}void Person::show(){std::cout << "我的名字是: " << m_name << ", 我今年" << m_age << "岁" << std::endl;}void Person::growupTo(int age/* =20 */){m_age = age;std::cout << m_name << "长到了: " << m_age << "岁" << std::endl;}
}
3. main.cpp
#include <rttr/type>
#include <iostream> #include "Person.h" int main(int argc, char* argv[])
{ rttr::type type = rttr::type::get_by_name("World::Person");rttr::variant var = type.create();rttr::property prop = type.get_property("name");prop.set_value(var, std::string("小明"));prop = type.get_property("age");prop.set_value(var, 18);rttr::method meth = type.get_method("show"); meth.invoke(var);std::cout << "属性: " << std::endl;for (auto& prop : type.get_properties()){std::cout << "属性名: " << prop.get_name() << ", 属性类性: " << prop.get_type().get_name() << ", 属性值:";// 判断类型if (prop.get_type() == rttr::type::get<int>()){std::cout << prop.get_value(var).to_int();}else if (prop.get_type() == rttr::type::get<std::string>()) {std::cout << prop.get_value(var).to_string();}std::cout << std::endl;}std::cout << "方法: " << std::endl;for (auto& meth : type.get_methods()){std::cout << "方法名称: " << meth.get_name() << ", 方法签名: " << meth.get_signature() << std::endl;for (auto& info : meth.get_parameter_infos()){std::cout << "方法参数下标: " << info.get_index() << ", 参数名" << info.get_name() << std::endl;}meth.invoke(var);}// getchar();return 0;
}
4. 编译执行
g++ -g main.cpp Person.cpp -lrttr_core && ./a.out
5. 解决反射失败
- 问题复现:
- 把Person类编译成动态库文件;
- 代码中没有显示构造Person对象;
- 代码中没有显示加载Person类所在的动态库;
- 解决方法:
- 把Person类直接和main()函数共同编译生成一个可执行文件;
- 在代码中显示地加载动态库文件;