我有一个"将军"容器,具有底层地图或矢量。例如:
class Container
{
typedef variant<vector<string>, map<string, string>> Data;
public:
iterator begin();
iterator end();
private:
Data mData;
};
我希望为用户提供一个通用的迭代器。很容易取消引用这样的迭代器,因为它总是可以返回一对值。
struct pair
{
string key;
string value;
}
如果是数组,键值将是索引。
但我不确定如何正确处理迭代器。目前我正试图做这样的事情:
class iterator
{
public:
iterator(vector<string>::iterator it);
iterator(map<string, string>::iterator it);
..
private:
bool m_isMap;
vector<string>::iterator it;
map<string, string>::iterator it;
};
但是这个实现有点乱。有没有更好的方法?或者甚至是一个准备好的提升解决方案?
答案 0 :(得分:2)
然而,通常要做的是创建使迭代器成为模板函数的函数,并为所需的各种迭代器实例化它。
您可以使用提升any_iterator
:
您可以使用Boost属性映射,这正是为了使用密钥创建/获取属性的一致接口。
make_iterator_property_map
作为向量(索引是键)make_associative_property_map
作为地图(使用地图的密钥)当然,这仍然需要代码将propertymap作为泛型参数(因为类型不同)。但是,您可以使用dynamic_property_map
:
滚动自己的类型擦除。你可以使用Boost Type Erasure作为构建块(它摇滚)。但是,当然,你可以在没有提升的情况下做到这一点。这可能是一个好处