【发布时间】:2015-10-28 11:30:33
【问题描述】:
假设我有一些类层次结构,其中有几个 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;
};
目前,只能在Interface 类的任何子类中实际返回vector、set 或map。但是,对于 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 推到array_view 之类的东西对我来说甚至是有意义的,但支持的操作更少(例如,没有随机访问)。 map 显然是一个不同的野兽,需要不同的 view 支持关联查找,但即使对于 map,我认为能够说 array_view<const std::pair<const int, int>> 也会很有用。我要求太多了吗?或者也许有合理的方法来实现这一点?或者甚至可能存在此类“视图”的现有实现?
PS:继承不是先决条件——我只是认为这是解决问题的最简单方法。
【问题讨论】:
标签: c++ c++11 c++14 array-view cpp-core-guidelines