RTTR


编译RTTR

在VS上使用RTTR的时候,需要关闭Standards conformance,使用编译参数/permissive,选项位置:C/C++ → Language → Conformance mode,VS的洁癖编译器老毛病了

#include <algorithm>
#include <iostream>
#include <string>
 
#include <rttr/registration_friend.h>
#include <rttr/registration>
 
class Person
{
public:
    Person(int Age = 18, const std::string& Name = "None") :m_iAge(Age), m_sName(Name) {}
    virtual ~Person() = default;
 
protected:
    int m_iAge;
    std::string m_sName;
 
public:
    void Say(const std::string& Content, int Times = 1)
    {
        for (int i = 1;i <= Times;i += 1)
        {
            printf("%s[%d]: %s\n", this->m_sName.c_str(), this->m_iAge, Content.c_str());
        }
    }
 
public:
    RTTR_REGISTRATION_FRIEND // registration_friend.h 可以注册私有成员
    RTTR_ENABLE() // 在有继承关系的时候要使用这个
};
 
class Boy : public Person
{
public:
    Boy() = default;
    virtual ~Boy() = default;
 
public:
    RTTR_ENABLE(Person) // 填上所有直接继承的父类
};
 
RTTR_REGISTRATION
{
    using namespace rttr;
    registration::class_<Person>("Person") // 注册一个类
        .constructor<int, const std::string&>() // 注册构造函数
        (
            policy::ctor::as_std_shared_ptr, // 确定创建的方式:std_shared_ptr
            // 指定函数的默认参数,可以指定N个,代表最后的N的参数
            default_arguments(18,std::string("None"))
        )
        .method("Say",&Person::Say)
        (
            default_arguments(1),
            // 注册函数参数的名字
            parameter_names("Content", "Times")
        );
}
 
int main()
{
    using namespace rttr;
    // 获取类型
    type tPerson = type::get_by_name("Person");
    // 生成实例
    // 注意传递参数的值,类型转换不像原生C++那样智能,const char*转不成std::string,而且还没报错
    variant P = tPerson.create({ 22, std::string("Zhonghui") });
    // 可以看一下,下面输出的两个类型是不一样的,因为指定了构造函数创建对象的方式是std_shared_ptr
    std::cout << tPerson.get_name() << " " << P.get_type().get_name() << std::endl;
    // 获取成员函数
    method mSay = tPerson.get_method("Say");
    // 执行成员函数,第一个先把实例传递进去
    mSay.invoke(P, std::string("I want to sleep!"), 3);
 
    return 0;
}