通过编程中的类中列出成员变量名称
List member variable names in a class programmatically
是否可以通过编程方式列出成员变量名称及其类型?例如:
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;
}
}
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 在C/C++中将变量名定义为__00000001有什么好处吗
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- 从私有成员变量的成员方法返回unique_ptr
- 为什么继承的函数会更改基类中的成员变量,而不是与名为它的对象同名的对象
- 在 c++ 中确定具有相同变量名的成员的 setter 的行为
- C++ - 在内部,在定义类的成员函数时,应该使用成员变量名还是其getter函数?
- 如何通过使用变量名访问QTabWidget类的成员选项卡