我正在思考 STL 迭代器的当前限制,并想知道是否有一种优雅的方法来解决它。这是我的情况:我有一个类,它封装了一个序列容器和一个通用方法来改变容器的内容,例如:
class Container {
typedef std::vector<int> Data;
Data data_;
public:
template <class Mutator>
?? mutate() {
Mutator m;
return m(??);
}
};
为简洁起见,省略了一些细节,但我正在考虑的主要问题是将什么传递给 mutator(m() 仿函数调用中的 ??)。第二个问题是从 mutate 返回什么以允许对 mutator 进行简单组合。一种可能性是将一对开始/结束迭代器传递(并返回)到 data_,甚至是 boost::sub_range,例如:
template <class Mutator>
boost::sub_range<Data> mutate() {
Mutator m;
return m(boost::sub_range<Data>(data_);
}
这将允许我对数据执行大部分我想要的操作,例如否定范围内的所有值、乘以一个因子等。这也允许我链接或组合各种变异器,就像在这个(缩短的)版本中一样:
return m1(m2(m3(data_)));
因此,例如,任何 mutator 都可以选择其输入的一个子范围来限制外部 mutator 工作的范围,这是一个理想的特性。所有这些mutators都可以就地更改数据,这非常有效。
然而,这种语法不能做的是修改容器的大小(至少不能使用向量),因此插入或删除元素的 mutator 不能与基于迭代器的接口一起使用。另一个接口将整个容器传递给 mutator。我不确定在这种情况下如何处理子范围,而且它也感觉不像基于通用和最低要求的基于迭代器的解决方案那样优雅的解决方案。
我将不胜感激有关如何处理此限制的任何想法。