Общий способ вернуть целую коллекцию - PullRequest
2 голосов
/ 02 июля 2010

В C ++, каков наилучший способ вернуть коллекцию клиентскому коду без использования итераторов.

Допустим, итераторы исключены, потому что, например, коллекция является удаленной. Мне нужна подпись для функции, которая возвращает коллекцию в максимально удобной форме.

Под «лучшим» я подразумеваю лучший компромисс между ясностью и универсальностью.

Мой инстинкт был (где result.push_back (obj) действителен C ++):

template <typename T>
void getCollection(T& result);

Интересно, есть ли у кого-нибудь лучшие идеи, например, которые также поддерживают вставки в контейнеры, которые не поддерживают push_back, или требуют преобразования объектов в коллекции.

Следующее, возможно?

template <typename Func>
void getCollection(Func f); // applies f to all the objects

Ответы [ 4 ]

4 голосов
/ 02 июля 2010

Итератор - это путь, который вы действительно хотите. Зачем? Потому что это позволяет клиенту вставить эти данные во все, что им нужно. Как вы знаете, у вас уже есть проблема с выбором способа прикрепления данных на конце контейнера, потому что есть разные способы. С OutputIterator, хотя вам не нужно беспокоиться об этом. Назначьте и двигайтесь вперед.

Черт, пользователь вашей функции может захотеть поместить данные в строку, и если вы используете метод итератора, это тривиально.

0 голосов
/ 02 июля 2010

Мне кажется, я наконец понял вашу проблему, просто перефразирую ее:

  • У вас есть коллекция объектов
  • Вы хотите, чтобы ваш клиент имел доступ к объектам, не зная подробностей реализации
  • Коллекция и клиент могут находиться на разных машинах (таким образом, у вас есть возможность поместить это в сообщение)

Я бы просто возвратилкопия коллекции, надлежащим образом обернутая для абстрагирования от фактической реализации.

Например, класс Collection с элементами begin и end для доступа к пользовательским итераторам.Класс создается с сериализованной формой коллекции и десериализует ее (лениво или нет).Ваш клиент может использовать итераторы для хранения данных в желаемой коллекции.

0 голосов
/ 02 июля 2010

Я думаю, вы должны лучше описать свою проблему.Проще говоря, чтобы вернуть коллекцию, я бы сказал, используйте шаблон, который возвращает итератор.Но если вы говорите о клиентском коде, то есть приложение будет разделено на несколько частей и они могут быть скомпилированы отдельно, я бы сказал, что единственный переносимый способ - использовать указатель на массив.Но что вы подразумеваете под удаленным?Если это означает отдельный компьютер, то вам нужна некоторая форма сериализации, такая как Boost :: Serialization или Protobuf .

0 голосов
/ 02 июля 2010

Мой любимый способ вернуть целую кучу данных из функции - использовать общие указатели:

boost::shared_ptr<vector<string>>  f()  {
   boost::shared_ptr<vector<string>> vec(new vector<string>());
   vec->push_back(....);
   return vec;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...