2012-02-18 48 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 */ 
} 
相关问题