返回整个集合的通用方法

时间:2010-07-02 16:10:29

标签: c++ templates

在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 个答案:

答案 0 :(得分:4)

迭代器方式是你真正想要的方式。为什么?因为它允许客户端将这些数据粘贴到他们需要的任何内容中。如您所知,您已经无法决定如何在容器末端粘贴数据,因为有不同的方法。使用OutputIterator虽然您不必担心它。分配并继续前进。

地狱,你的函数的用户可能想要将数据粘贴在字符串中,如果你使用迭代器方法,这是微不足道的。

答案 1 :(得分:0)

我认为你必须更好地描述你的问题。简单地说,要返回一个集合,我会说,使用一个返回迭代器的模板。但是如果你在谈论客户端代码,即应用程序将被分成几个部分并且它们可能被单独编译,我会说唯一可移植的方法是使用指向数组的指针。但是,你的远程是什么意思?如果它意味着单独的机器,那么您需要某种形式的序列化,如Boost::SerializationProtobuf

答案 2 :(得分:0)

我想我终于理解了你的问题,我只想改写一下:

  • 您有一组对象
  • 您希望您的客户在不知道实施细节的情况下访问这些对象
  • 集合和客户端可能位于不同的计算机上(因此您可以将其放入消息中)

我只是返回一个集合的副本,适当地包装以抽象出实际的实现。

例如,Collection类,beginend成员访问自定义迭代器。该类使用序列化形式的集合进行实例化,并对其进行反序列化(懒惰或不懒惰)。您的客户端可以使用迭代器来存储她希望的集合中的数据。

答案 3 :(得分:-1)

我朋友最喜欢的从函数返回一大堆数据的方法是使用共享指针:

boost::shared_ptr<vector<string>>  f()  {
   boost::shared_ptr<vector<string>> vec(new vector<string>());
   vec->push_back(....);
   return vec;
}