我正在思考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工作的范围,这是一个理想的特性。所有这些mutator都可以就地更改数据,这非常有效。
但是,这种语法不能修改容器的大小(至少不能使用向量),因此插入或删除元素的mutators不能与基于迭代器的接口一起使用。另一种接口将整个容器传递给mutator。在这种情况下,我不确定如何处理分类,并且它也比基于通用和最小要求迭代器的解决方案感觉更不优雅。
我很感激有关如何处理此限制的任何想法。
答案 0 :(得分:0)
您可以将仿函数(思考:函数合成)与boost::bind结合使用。
另一方面,我觉得我并不完全明白:第二个仿函数应该在与第一个仿函数不同的范围内工作吗?数据是否会从容器中删除?
请注意:您当前的解决方案具有非显而易见的成本:“mutators”的每个组合都需要新的迭代而不是“mutators的真实组合”。