[英]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.