Какой лучший способ вернуть что-то вроде коллекции `std :: auto_ptr`s в C ++ 03? - PullRequest
7 голосов
/ 25 декабря 2010

std::auto_ptr не разрешается хранить в контейнере STL, например std::vector.Однако иногда бывают случаи, когда мне нужно вернуть коллекцию полиморфных объектов, и поэтому я не могу вернуть вектор объектов (из-за проблемы среза).Я могу использовать std::tr1::shared_ptr и вставить их в vector, но тогда мне придется заплатить высокую цену за поддержание отдельных подсчетов ссылок, и объект, который владеет фактической памятью (контейнером), больше не логически «владеет» объектами, потому чтоони могут быть скопированы из него без учета права собственности.

C ++ 0x предлагает идеальное решение этой проблемы в виде std::vector<std::unique_ptr<t>>, но у меня нет доступа к C ++ 0x.

Некоторые другие примечания:

  • У меня нет доступа к C ++ 0x, но у меня есть TR1.
  • Я хотел бы избежать использованияBoost (хотя он доступен, если нет другой опции)
  • Я знаю о boost::ptr_container контейнерах (то есть boost::ptr_vector), но я бы хотел избежать этого, потому что он ломает отладчик (внутренностихранится в void * с, что означает, что трудно увидеть объект, фактически сохраненный в контейнере в отладчике)

1 Ответ

3 голосов
/ 25 декабря 2010

Что я хотел бы сделать, это инкапсулировать собственный массив кучи. Вы можете определить любое подмножество векторного интерфейса, которое вы можете поддерживать, не требуя копирования.

...