是否可以以编程方式列出成员变量名称及其类型? e.g:
class MyClass
{
public:
MyClass();
~MyClass();
private:
uint16_t bob;
uint8_t dave;
uint8_t mick;
int8_t bazzer;
};
我需要找到(在代码中)变量名称是什么以及它们有多大,即bob是uint16_t。我知道Java中有一些叫做“反射”的东西,这似乎做了我想做的事情,但我正在用C ++直接做些什么。
答案 0 :(得分:3)
不,C ++中没有反映,你想要的是不可能的。
但是,您可以使每个类都符合您定义的接口。虽然这要求您手动提供信息:
struct Foo
{
uint16_t bar;
char bar2;
//maybe you want to return a typeid hash here instead of a string
static std::map<std::string, std::string> GetMembers()
{
return {("bar", "uint16_t"), ("bar2", "char")};
}
}
代码生成器可以通过生成AST而不是插入上面的代码来为您完成这项工作。
对于更高级的方法,我会返回std::vector<MemberInfo>
,MemberInfo
是一个包含所有相关信息的类。
这种方法可能如下:
struct MemberInfo
{
std::string m_name;
size_t m_size;
};
template<typename T>
struct Reflection;
template<>
struct Reflection<Foo>
{
static std::vector<MemberInfo> GetMembers()
{
return {{"bar", sizeof(decltype(Foo::bar))}, {"bar2", sizeof(decltype(Foo::bar2))}}
}
};
template<typename T>
void PrintMembers()
{
for (auto& member : Reflection<T>::GetMembers())
{
std::cout << "name: " << member.m_name << " size: " << member.m_size << std::endl;
}
}