我想要做的是隨機選擇一個結構的成員。我會創建一個結構的實例,然後通過其成員的「路徑」併到達最後一個成員。我將用它作爲一個隨機項目生成器。所以它會創建這樣的東西:你會如何從結構中隨機選擇一條路徑?
item new_item;
然後它會隨機選擇它有哪些成員。
new_item.item_class.part1.part2.end
請記住,該項目的部分將隨機選擇。我不知道如何實現這一點,並且我到處搜索了一個起點。
我想要做的是隨機選擇一個結構的成員。我會創建一個結構的實例,然後通過其成員的「路徑」併到達最後一個成員。我將用它作爲一個隨機項目生成器。所以它會創建這樣的東西:你會如何從結構中隨機選擇一條路徑?
item new_item;
然後它會隨機選擇它有哪些成員。
new_item.item_class.part1.part2.end
請記住,該項目的部分將隨機選擇。我不知道如何實現這一點,並且我到處搜索了一個起點。
這在C++中是不可能的,除非您手動編寫結構的描述以及遵循它們的函數。
換句話說,如果您自己手動實現,則只會獲得此功能。 C++運行庫不會保留所需的信息。
編輯:有些庫可以幫助創建C++反射機制代碼,通過模板和宏。嘗試搜索「C++中的反射」。
這沒有意義。 C++是一種靜態類型語言,因此您必須在編譯時確定要使用的類型。你不能在C++中選擇「隨機類型」,因此你不能引用「隨機類成員」。
,你可以做是選擇一個隨機元素從諸如vector
或array
均勻容器(基本上是通過拾取隨機指數)唯一明智的事情。
請注意,基類指針集合確實是一個同類集合,可用於處理異構對象集合,但它們都必須從相同類型派生。訪客(使用動態強制轉換)可用於處理實際的具體實例。也許,這可能是一個有用的方法,所以讓我寫一個例子:
struct Object { virtual ~Object() { } };
struct Foo : Object { /* ... */ };
struct Bar : Object { /* ... */ };
std::vector<std::unique_ptr<Object>> v;
// populate v, e.g. "v.emplace_back(new Bar);"
for (auto & p : v)
{
if (Foo * q = dynamic_cast<Foo*>(p.get())) { /* use q */ }
else if /* further cast attempts */
}
如果您還沒有這樣做的話,請閱讀此線程:http://stackoverflow.com/questions/41453/how-can -i-增加反射到AC-應用 – kfmfe04 2012-02-18 01:03:36