Skip to content

Heptagon196/Reflection

Repository files navigation

简单的 C++ 反射库,思路参考 https://github.com/Ubpa/UDRefl

并使用反射实现了简单的 JSON 库

示例

struct Test {
    int p = 123;
    void add(int a, int b) {
        std::cout << a << " + " << b << " = " << a + b << std::endl;
    }
};

void test1() {
    ReflMgrTool::Init(); // 自动注册常用类型

    auto& mgr = ReflMgr::Instance();
    mgr.AddClass<Test>();
    mgr.AddField(&Test::p, "p");
    mgr.AddMethod(&Test::add, "add");

    auto instance = mgr.New(TypeID::get<Test>());
    std::cout << instance.GetField("p") << std::endl;
    instance.Invoke("add", { SharedObject::New<int>(1), SharedObject::New<int>(2) });
}

支持自动注册部分方法

ReflMgrTool::AutoRegister<int>(); // 自动注册元方法
ReflMgrTool::AutoRegister<std::vector<int>>();
ReflMgrTool::AutoRegister<std::vector<int>::iterator>();

auto& mgr = ReflMgr::Instance();
mgr.AddMethod( // 手动注册元方法
    std::function([](std::vector<int>* self) {
        std::cout << '[' << (*self)[0];
        for (int i = 1; i < self->size(); i++) {
            std::cout << ", " << (*self)[i];
        }
        std::cout << ']';
    }),
    MetaMethods::operator_tostring
);

SharedObject s = mgr.New<std::vector<int>>();
for (int i = 0; i < 5; i++) {
    s.Invoke("push_back", { SharedObject::New<int>(i) });
}
SharedObject p = mgr.New<int>();
for (SharedObject i : s) {
    std::cout << i << std::endl;
}
std::cout << s << std::endl;

继承

struct Adder {
    int p = 123;
    void add(int a, int b) {
        std::cout << p << ": " << a << " + " << b << " = " << a + b << std::endl;
    }
};

struct Test {
    std::string val = "_test";
    void test() {
        std::cout << "test" << val << std::endl;
    }
};

struct P : public Adder, public Test {};

void inheritanceTest() {
    ReflMgrTool::Init();
    auto& mgr = ReflMgr::Instance();

    mgr.AddClass<P>();
    mgr.SetInheritance<P, Adder, Test>(); // 声明继承关系

    mgr.AddMethod(&Adder::add, "add");
    mgr.AddMethod(&Test::test, "test");
    mgr.AddField(&Adder::p, "p");
    mgr.AddField(&Test::val, "val");

    auto instance = mgr.New<P>();
    std::cout << instance.GetField("p") << std::endl;
    std::cout << instance.GetField("val") << std::endl;
    instance.Invoke("test");
    instance.Invoke("add", { SharedObject::New<int>(1), SharedObject::New<int>(2) });
}

JSON 库

ReflMgrTool::Init();
JSON::Init();
JSON data("{a:{arr:[1,2,\"hello\"]}, b:1, c:temp}");
data["a"]["arr"][0] = "abc";
data.RemoveItem("b");
data.AddItem("d", JSON::NewMap());
data["d"].AddItem("1", JSON{"temp"});
data["a"]["arr"].AddItem(JSON{"test"});
std::cout << data << std::endl;
std::cout << data["a"] << std::endl;
std::cout << data["a"]["arr"] << std::endl;
std::cout << data["a"]["arr"][1] << " " << data["a"]["arr"][2] << std::endl;
std::cin >> data;
std::cout << data << std::endl;

数值类型隐式转换

ReflMgr::Instance().AddStaticMethod(Namespace::Global.Type(), std::function(
    [](int i, double f, int size) {
        printf("%d %lf %d\n", i, f, size);
    }
), "print");
Namespace::Global.Invoke("print", { SharedObject::New<double>(12.123), SharedObject::New<int>(2), SharedObject::New<size_t>(3) });

About

A simple C++ reflection library

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages