繁体   English   中英

在基于范围的for循环中使用的方法返回容器

[英]Method returning container for use in range-based for loop

我有一个包含要在方法中返回的标准容器的类,如下所示(仅作为示例):

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

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

您可以创建一个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;

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

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM