我正在尋找一種遍歷所有PATTERNS成員的方法。我不能使用vector. 理想情況下,我希望能夠獲得下一個成員struct并在到達終點時將其重置。我的理解是我本質上想要一個鏈表。事情是我有很多struct這樣的,我發現創建一個struct包含一個陣列并帶有指向下一個struct包含下一個陣列的指標的陣列效率很低。
問:你會如何遍歷所有struct的成員?
struct PATTERNS {
bool P0[3] = {0, 0, 1};
bool P1[3] = {0, 1, 1};
bool P2[3] = {1, 1, 1};
};
編輯:回答@user17732522 - 我正在嘗試從python(itertools)復制代碼。它主要是為了使用方便和更多的OOP。快速修復只是制作一個二維布爾陣列。
uj5u.com熱心網友回復:
簡短的回答是“你不能。”。
C 不提供任何反射特性,因為它們在不破壞向后兼容性的情況下限制了語言的開發。
您可以使用std::vector和一點型別的擦除(如std::variant)來實作您想要的。
如果你真的想要反射,你可以使用Boost Reflect Library或者查看你的編譯器支持的擴展。我不會推薦其中任何一個選項。
uj5u.com熱心網友回復:
沒有辦法在 C 中迭代成員(沒有元編程)。
您可以進行一些小的更改以使用陣列作為成員。您可以在 C 中迭代陣列:
struct PATTERNS {
bool P[3][3] = {
{0, 0, 1},
{0, 1, 1},
{1, 1, 1},
};
};
仍然可以使用名稱參考子陣列,但它需要相當多的樣板檔案:
union PATTERNS {
using PA = bool[3];
struct {
PA P[3];
operator PA&() & { return P[0]; }
operator const PA&() const & { return P[0]; }
PA* operator&() { return &P[0]; }
} P0;
struct {
PA P[3];
operator PA&() & { return P[1]; }
operator const PA&() const & { return P[1]; }
PA* operator&() { return &P[1]; }
} P1;
struct {
PA P[3];
operator PA&() & { return P[2]; }
operator const PA&() const & { return P[2]; }
PA* operator&() { return &P[2]; }
} P2;
struct {
PA P[3];
PA* begin() { return std::begin(P); }
PA* end() { return std::end(P); }
} P;
};
我不知道這是否可以與默認成員初始化程式一起使用,例如您示例中的初始化程式。
uj5u.com熱心網友回復:
那么一種快速而骯臟的方法是將您的結構簡單地轉換為陣列bool并列印:
PATTERNS ptn;
auto p = (bool *)&ptn;
copy(p, p 9, ostream_iterator<bool>(cout, " "));
您可以在這里看到它的實際效果。
請注意沒有執行編譯器對齊,否則您會遇到麻煩。使用#pragma pack或您的特定編譯器的風格來禁用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/437747.html
標籤:C
