2012-02-18 49 views
1

我想要做的是隨機選擇一個結構的成員。我會創建一個結構的實例,然後通過其成員的「路徑」併到達最後一個成員。我將用它作爲一個隨機項目生成器。所以它會創建這樣的東西:你會如何從結構中隨機選擇一條路徑?

item new_item; 

然後它會隨機選擇它有哪些成員。

new_item.item_class.part1.part2.end 

請記住,該項目的部分將隨機選擇。我不知道如何實現這一點,並且我到處搜索了一個起點。

+3

如果您還沒有這樣做的話,請閱讀此線程:http://stackoverflow.com/questions/41453/how-can -i-增加反射到AC-應用 – kfmfe04 2012-02-18 01:03:36

回答

1

這在C++中是不可能的,除非您手動編寫結構的描述以及遵循它們的函數。

換句話說,如果您自己手動實現,則只會獲得此功能。 C++運行庫不會保留所需的信息。

編輯:有些庫可以幫助創建C++反射機制代碼,通過模板和宏。嘗試搜索「C++中的反射」。

1

這沒有意義。 C++是一種靜態類型語言,因此您必須在編譯時確定要使用的類型。你不能在C++中選擇「隨機類型」,因此你不能引用「隨機類成員」。

,你可以是選擇一個隨機元素從諸如vectorarray均勻容器(基本上是通過拾取隨機指數)唯一明智的事情。

請注意,基類指針集合確實是一個同類集合,可用於處理異構對象集合,但它們都必須從相同類型派生。訪客(使用動態強制轉換)可用於處理實際的具體實例。也許,這可能是一個有用的方法,所以讓我寫一個例子:

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 */ 
} 
相關問題