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

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

我需要找到(在代码中)变量名是什么以及它们有多大,即bob是uint16_t。我知道Java中有一个叫做“反射”的东西,这似乎可以满足我的要求,但是我一直在追求C++语言。

最佳答案

不,在C++中没有思考,您想要的是不可能的。

但是,您可以使每个类都符合您定义的接口(interface)。尽管这需要您手动提供信息:

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

关于c++ - 以编程方式列出类中的成员变量名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21609046/

10-11 21:35