C++ c++;将未知结构转换为字符串

C++ c++;将未知结构转换为字符串,c++,parsing,struct,void,C++,Parsing,Struct,Void,我有个问题。是否可以从结构中获取所有数据类型和变量名?例如: void func(void *p){ std::cout << "p->type_1" << ... << "p->type_x" << std::endl; std::cout << "p->name_1" << ... << "p->name_x";} typedef struct{ int a; char b; f

我有个问题。是否可以从结构中获取所有数据类型和变量名?例如:

void func(void *p){
std::cout <<  "p->type_1" << ... << "p->type_x" << std::endl;
std::cout <<  "p->name_1" << ... << "p->name_x";}

typedef struct{
int a;
char b;
float c;
}test;

test a;
func(&a); 
//There should come something like 
"int char float"
"a b c"
void func(void*p){

std::cout如果它是一个结构,那么所有字段都是公共的,因此没有什么可以阻止您执行std::cout a)b)无法从结构中检索。
从变量中,可以得到:

int a= 5;
cout << "a has type: " << typeid(a).name() 
inta=5;
cout不是直接的,一个可以帮助,但这真的很难看:

#include <stdio.h>

#define TEST \
    X(int a;) \
    X(char b;) \
    X(float c;)

typedef struct {
#define X(x) x
    TEST
#undef X
} test;

void print()
{
#define X(x) puts(#x);
    TEST
#undef X
}

int main(void)
{
    print();
    return 0;
}

此工作,您需要支持C++中的内省,以及运行时类型信息。有些语言内置了此,但C++不(对此,还不够)。 根据需要,您可以构建有关

struct
数据类型的信息,并将指向该信息的指针与该结构指针一起传递到函数中。用于此操作的有用工具可能是
typeid
操作符、
offsetof
宏、
typeof
宏以及带有它的C预处理器s stringify运算符(
#

有了这些,您应该能够构建一个数组,其中包含字段的名称、标识字段的基本类型以及可以在
void*
中找到的偏移量。如果您还需要支持其他
struct
类型的字段,您可能需要做更多的工作(基本上,您需要将它们的字段嵌入到该结构中,或者引用它

也就是说,可能有更好、更简单的方法来实现这一点,这取决于您需要输出的内容,以及您对代码和要打印的
struct
s的控制程度

例如,大多数调试器可以使用特定于平台的调试元数据打印
struct
s,因此,如果您只是想改善调试体验,则可能不需要这种方法(此信息通常位于单独的文件中,包含许多其他内容,因此不适合在调试外部使用)

交替地,如果你可以修改类(在C++类和Stult s是相同的事情),你可以给他们一个共同的基类和一个<代码>打印()/<代码>方法。然后每个<代码>结构> <代码>都知道如何打印自己,你可以调用它。


如果您可以使用,可能还有其他解决方案,但这取决于您为什么需要这个控件以及谁控制要打印的类,以及为什么。例如,对象图序列化工具等。< /P>不,C++不支持反射(还)。.typeid充其量只能提取类型,如果你知道名称的话。问题是我们不知道什么类型的

struct
可以访问
func
。它可能不包含字段
a
b
“如果它是一个结构,所有字段都是公共的…”不,不是C++。在这个特殊的例子中,所有成员都是公开的,但这与使用的代码>结构>代码不相关。同样的可以用<代码>类< /C> >。莎莎是正确的,我想写的函数不知道结构的类型。我知道我可以把空指针转换成我需要的结构,但这不是我想要的。hopanza“如果是结构,字段默认可见性为public*”好吧?那么,不,C++中没有反身性。你可以在模板函数中转换你的函数,它基本上是一样的,但是如果你想读或写你使用的类型名中不存在的字段,就不会编译。
int a;
char b;
float c;