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()函数共同编译生成一个可执行文件;
- 在代码中显示地加载动态库文件;