Как бы вы случайно выбрали путь из структуры? - PullRequest
1 голос
/ 18 февраля 2012

То, что я хочу сделать, - это случайный выбор элементов структуры.Я бы создал экземпляр структуры, после чего он прошел бы «путь» своих членов и пришел бы к самому последнему члену.Я собираюсь использовать это как генератор случайных предметов.поэтому он создаст что-то вроде этого:

item new_item;

Затем он будет случайным образом выбирать, какие члены у него есть.Я понятия не имею, как это реализовать, и я везде искал отправную точку.

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

Это не имеет смысла. 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 */
}
1 голос
/ 18 февраля 2012

Это невозможно в C ++, если только вы вручную не напишите описание своих структур и функций, которые им следуют.

Другими словами, вы получите эту функцию только в том случае, если вы реализуете ее вручную. Среда выполнения C ++ не будет хранить необходимую информацию.

Редактировать: есть библиотеки, которые могут помочь в создании кода для механизмов отражения в C ++ с помощью шаблонов и макросов. Попробуйте поискать «отражение в C ++».

...