以编程方式列出类中的成员变量名称

时间:2014-02-06 16:51:49

标签: c++

是否可以以编程方式列出成员变量名称及其类型? 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 ++直接做些什么。

1 个答案:

答案 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;
    }
}