在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; }