簡體   English   中英

C ++將未知結構轉換為字符串

[英]c++ converting unknown struct to string

我有個問題。 是否可以從結構中獲取所有數據類型和變量名稱? 例如:

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"

X-Macro不能直接提供幫助,但這確實非常丑陋:

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

輸出:

int a;
char b;
float c;

為此,您需要支持C ++中的自省以及運行時類型信息。 某些語言內置了此功能,但C ++沒有內置功能(嗯,不足以實現此目的)。

根據您的需求,您可以構建有關struct數據類型的信息,並將指向該信息的指針以及該struct指針傳遞給函數。 有用的工具可能是typeid運算符, offsetof宏, typeof宏以及帶有字符串化運算符( # )的C預處理器。

通過這些,您應該能夠構建一個包含字段名稱的數組,該數組可以標識字段具有的原始類型以及可以在void*處找到的偏移量。 如果您還需要支持其他struct類型的字段(基本上,您需要將其字段嵌入到該結構中或對其進行引用),則可能需要做更多的工作。

也就是說,可能有更好,更簡單的方法來執行此操作,具體取決於您需要此輸出的內容以及對代碼和要打印的struct的控制程度。

例如,大多數調試器可以使用特定於平台的調試元數據來打印struct ,因此,如果您只是想改善調試體驗,則可能不需要此方法(此信息通常位於單獨的文件中,並且包含許多其他內容,因此不是不適合在外部調試中使用)。

或者,如果您可以修改類(在C ++類和struct中是同一件事),則可以為它們提供一個通用的基類和一個print()方法。 然后,每個struct都將知道如何打印自己,您可以調用它。

如果可以使用,可能還有其他解決方案,但這取決於您為什么需要此解決方案以及由誰來控制要打印的類以及原因。 例如對象圖序列化工具等。

無法從struct檢索。
從變量中,您可以獲得:

int a= 5;
cout << "a has type: " << typeid(a).name() 

輸出:int

如果是結構,則所有字段都是公共字段,因此沒有什么可以阻止您執行std :: cout << typeid(p-> a)<< typeid(p-> b)<< std :: endl; std :: cout << p-> a << p-> b << endl

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM