Доступ к производным объектам в boost :: ptr_vector - PullRequest
0 голосов
/ 30 апреля 2011

Я использую boost :: ptr_vector , который я также использую для хранения объектов класса B: открытый класс A. Я хочу иметь возможность доступа к объектам класса B в векторе;как мне разыграть, чтобы получить доступ?

1 Ответ

0 голосов
/ 30 апреля 2011

В идеале A должен предоставлять виртуальный интерфейс, который позволяет вам получать доступ к нужным вам частям B. Если вам нужен доступ к фактическим B объектам, вам нужно будет использовать dynamic_cast для ссылки, выданной итератором в контейнер (вы можете использовать static_cast, если вы точно знаете, что итератор действительно указывает на B объект):

// Create a container and insert a new element into it:
boost::ptr_vector<A> s;
s.push_back(new B());

// Get a reference to that element we just inserted:
B& b_ref = dynamic_cast<B&>(*s.begin());

Если вы хотите перебрать все элементы B в контейнере (и пропустить все элементы, не являющиеся B), вы можете сделать это довольно легко, используя комбинацию Boost's transform_iterator (для преобразования каждого *). 1013 * до B&) и filter_iterator (чтобы пропустить все элементы, не являющиеся B в контейнере).

...