返回容器的方法,用于基于范围的for循环

时间:2014-08-18 05:20:59

标签: c++ c++11

我有一个类,它包含一些我希望在方法中返回的标准容器,就像这样(只是一个例子):

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()方法,因为每个类可能有多个这样的容器。

这样做的首选方式是什么?

2 个答案:

答案 0 :(得分:3)

您可以创建typedef并在功能签名中引用它:

class IntArray
{
public:
    typedef std::vector<int> Vec;

    IntArray(const Vec& vals) : vals(vals) {}

    const Vec& getValues() const { return vals; }
    Vec& getValues() { return vals; }

private:
    Vec vals;
};

现在,如果您想更改存储类型,只需更改typedef:

typedef std::list<int> Vec;

答案 1 :(得分:0)

您可以使用自己的模板进行概括:

template<typename CONTAINER>
class IntArray
{
    typedef CONTAINER<int> Vec;
public:
    IntArray(const Vec& vals) : vals(vals) {}
    const Vec& getValues() const { return vals; }
    Vec& getValues() { return vals; }

private:
    Vec vals;
};

现在您可以随意指定容器类型:

std::list<int> vals { 0, 1, 2, 3, 4 };
IntArray<std::list> arr(vals);
for(int val: arr) {
    // Something
}