RTTR反射机制示例

该文章已生成可运行项目,

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. 编译执行

# 指定链接库 rttr_core
g++ -g main.cpp Person.cpp -lrttr_core && ./a.out

5. 解决反射失败

  1. 问题复现:
    1. 把Person类编译成动态库文件;
    2. 代码中没有显示构造Person对象;
    3. 代码中没有显示加载Person类所在的动态库;
  2. 解决方法:
    1. 把Person类直接和main()函数共同编译生成一个可执行文件;
    2. 在代码中显示地加载动态库文件;
本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞天遇见妞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值