通过编程中的类中列出成员变量名称

List member variable names in a class programmatically

本文关键字:成员 变量名 编程      更新时间:2023-10-16

是否可以通过编程方式列出成员变量名称及其类型?例如:

class MyClass
{
public:
    MyClass();
    ~MyClass();
private:
    uint16_t    bob;
    uint8_t     dave;
    uint8_t     mick;
    int8_t     bazzer;    
};

我需要(在代码)中找到变量名是什么以及它们有多大的影响,即鲍勃是uint16_t。我知道Java中有一些称为"反射"的东西,这似乎可以做我想要的,但是我追求直接的C 。

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