我目前正在设计一个接口(Base
在以下示例中),它提供了几个虚拟方法,包括begin()
和end()
。这两个方法简单地返回相应的迭代器,就像在任何其他集合(如类)中一样。派生类应实现这些方法并返回其特定的迭代器实现。
以下(简化)示例显示了一个派生类,它使用 aboost::transform_iterator
来转换私有内部整数列表。这个实现只是现实中的一个例子,迭代的“东西”可以是别的东西,迭代器也是如此。
该示例有效,但我有一个问题。in 的对象类型main()
并没有隐藏使用的迭代器是 type 的事实TransformIterator
。基类将用于某种插件架构,其中每个插件都是一个共享库。插件不应该知道使用了哪种类型的迭代器,而应该完全依赖于抽象接口。有没有办法做到这一点?
#include <boost/iterator/transform_iterator.hpp>
#include <iostream>
#include <string>
#include <vector>
template<class Iterator>
class Base
{
public:
virtual Iterator begin() = 0;
virtual Iterator end() = 0;
};
struct toString
{
std::string operator()(int number) const
{
return std::to_string(number);
}
};
typedef boost::transform_iterator<toString, std::vector<int>::iterator> TransformIterator;
class Derived : public Base<TransformIterator>
{
public:
Derived() : ints{132, 3, 6451, 12, 5} {}
TransformIterator begin()
{
return boost::make_transform_iterator(ints.begin(), toString());
}
TransformIterator end()
{
return boost::make_transform_iterator(ints.end(), toString());
}
private:
std::vector<int> ints;
};
int main()
{
Base<TransformIterator>* obj = new Derived();
for(const auto& value : *obj)
{
std::cout << value.size() << std::endl;
}
return 0;
}
更多背景知识:这个具体示例基于读取配置文件的接口。目前我只打算为 YAML 文件提供一个实现,但其他格式,如 XML 或老式 INI 也是可能的。因此是一个通用接口。