假设我有一些类层次结构,其中有几个virtual
函数返回容器引用:
#include <vector>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
class Interface {
public:
virtual const std::vector<int>& getArray() const = 0;
virtual const std::set<int>& getSet() const = 0;
virtual const std::map<int, int>& getMap() const = 0;
};
class SubclassA : public Interface {
public:
const std::vector<int>& getArray() const override { return _vector; }
const std::set<int>& getSet() const override { return _set; }
const std::map<int, int>& getMap() const override { return _map; }
private:
std::vector<int> _vector;
std::set<int> _set;
std::map<int, int> _map;
};
目前,只能在类的任何子类中实际返回 a vector
、set
或。但是,对于这一部分,我可以使用例如 a来软化这个限制:map
Interface
vector
gsl::array_view
class Interface {
public:
virtual gsl::array_view<const int> getArray() const = 0;
virtual const std::set<int>& getSet() const = 0;
virtual const std::map<int, int>& getMap() const = 0;
};
class SubclassA : public Interface {
public:
gsl::array_view<const int> getArray() const override { return _vector; }
const std::set<int>& getSet() const override { return _set; }
const std::map<int, int>& getMap() const override { return _map; }
private:
std::vector<int> _vector;
std::set<int> _set;
std::map<int, int> _map;
};
class SubclassB : public Interface {
public:
gsl::array_view<const int> getArray() const override { return _array; }
// const std::set<int>& getSet() const override { return _set; }
// const std::map<int, int>& getMap() const { return _map; }
private:
std::array<int, 3> _array;
std::unordered_set<int> _set;
std::unordered_map<int, int> _map;
};
所以问题是,是否有用于array_view
其他容器类型的替代方案?基本上,我想要的是一个轻量级对象,我可以从一个函数返回,该函数将充当某个容器的不可变视图,而无需指定特定的容器类型。std::set
将 a 推到类似 an的位置对我来说甚至是有意义的array_view
,但支持的操作较少(例如,没有随机访问)。map
显然是不同的野兽,需要不同的view
支持关联查找,但即使对于 amap
我认为有能力说array_view<const std::pair<const int, int>>
. 我要求太多了吗?或者也许有合理的方法来实现这一点?或者甚至可能存在这种“视图”的现有实现?
PS:继承不是先决条件-我只是认为这是提出问题的最简单方法。