【发布时间】:2014-08-18 14:17:08
【问题描述】:
我有一个类,其中包含一些我想在方法中返回的标准容器,就像这样(只是一个例子):
class IntArray
{
public:
IntArray(const vector<int>& vals) : vals(vals) {}
const vector<int>& getValues() const { return vals; }
vector<int>& getValues() { return vals; }
private:
vector<int> vals;
};
我通过引用返回了向量以避免复制它(我不想依赖 RVO)。我不想使用 OutputIterators 来做到这一点,因为我真的想用 C++11 基于范围的 for 循环来保持简短,如下所示:
for (int val : arr.getValues()) {
// Something
}
但是如果我想将成员变量的类型更改为list<int>,那么我也必须更改方法的返回类型,这可能会导致不兼容。我也不想实现begin() 和end() 方法,因为每个类可能有多个这样的容器。
这样做的首选方法是什么?
【问题讨论】:
-
std::begin和std::end支持的所有类,或者具有begin和end成员函数的类,都将由 ranged-basedforloop 支持。当然这包括所有standard containers。 -
你为什么要使用这个包装器?为什么不直接返回一个 sequence
,其中 sequence 包装了 vector 或 list 并提供了 .begin() 和 .end() 方法? -
有一篇关于这个问题的好文章here。
-
@Michael:这里的 IntArray 只是一个例子。实际上,例如,我正在使用可能同时包含子网格和纹理的网格之类的东西。并且引入一个只包装这两个容器的类对我来说似乎有点沉重。