Skip to content

DarcJC/ZenoReflect

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Zeno Reflect

本项目应该支持C++17及以上的C++标准。

English | 中文

Quickstart

  1. 把本项目作为子模块添加到你的项目中
  2. 引入本项目作
add_subdirectory(/path/to/ZenoReflect)
  1. 然后在你需要反射的模块中使用(参考examples文件夹下内容)
make_absolute_paths(REFLECTION_HEADERS 
    include/data.h
    include/test.h
) 
zeno_declare_reflection_support(ReflectExample "${REFLECTION_HEADERS}")

Mechanism

首先要明确的是,这是一个运行时反射。在执行一些操作时,会进行类型擦除以满足运行时接口的要求。 你可以在运行时使用任何类型(包括被实例化的模版),只要它们被正确地注册到反射系统中。

还有,目前类型擦除系统还未完善,可能会出现问题。

目前暂不支持类型的手动注册,所有的注册代码都是在编译时根据反射标记自动生成的。

调用zeno_declare_reflection_support会自动产生一个进行反射生成的target,并且你的target会依赖这个新的target。 这意味着反射信息只会保证在你的target编译前被生成,不要在其它任何未启用反射的target中假设静态反射信息已经存在。当然在任何地方使用运行时的API是安全的(除了静态初始化阶段,不去假设静态初始化顺序是一个好习惯)。

target的运行时信息注册会通过添加一个由反射生成器生成的源码文件来实现,它当前会位于[CMAKE文件夹]/intermediate/[target名称]/[target名称].generated.cpp

而所需的静态信息则会生成在crates/libgenerated/include/reflect文件夹中。如果你需要静态反射信息,你要在你代码中写上#include "reflect/reflection.generated.hpp"。在你为你的target启用反射时,libgenerated就会添加为你target的interface类型依赖。

FQA

Q: 有什么限制 A: 不能有同名类型同时拥有反射标记,且头文件名不应重名

About

A C++17 runtime reflection toolchain

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published