我有一个类,它包含一些我希望在方法中返回的标准容器,就像这样(只是一个例子):
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()
方法,因为每个类可能有多个这样的容器。
这样做的首选方式是什么?
答案 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
}