我正在对接口进行编程,并且我想以一种通用的方式对其内容进行交互。所以,一般来说,我的接口有这样的原型:
class Interface
{
public:
class Iterator;
virtual Interface::Iterator* begin() = 0;
virtual Interface::Iterator* end() = 0;
class Iterator
{
public:
virtual const Iterator* operator++() = 0;
virtual bool operator!=(const Iterator& i) = 0;
};
};
下面是一个简单专业化的示例:
class Derived : public Interface
{
public:
Derived() : array {2, 0, 1, 5, 4, 3} {};
Iterator* begin() { return new Derived::IterDerived(0);};
Iterator* end() { return new Derived::IterDerived(6);};
int array[6];
public:
class IterDerived : public Interface::Iterator
{
public:
IterDerived(int i) {pos = i;};
IterDerived(IterDerived&& i) {pos = i.pos;};
const Interface::Iterator* operator++() override { ++pos; return this;};
bool operator!=(const Interface::Iterator& i) { return pos != dynamic_cast<const Derived::IterDerived&>(i).pos;};
int position() { return pos;};
private:
int pos;
};
};
到目前为止,一切都很好。现在,我想编写一段代码,允许我使用新的 for 范围迭代其内容,如新标准 (c++11) 中所述。请注意,在实际接口中,我将提供 getter 方法,因此无需使用 dynamic_cast。IE:
int main()
{
Interface *a = new Derived();
for(auto i : a)
std::cout << dynamic_cast<Derived*>(a)->array[dynamic_cast<Derived::IterDerived*>(i.get())->position()] << " ";
std::cout << std::endl;
}
但是这段代码无法编译。为了编译,我需要使用以下形式的宏:
#define FOR_ITERATOR(iter, object) \
for(std::unique_ptr<Interface::Iterator> iter((object)->begin()), \
iter##end((object)->end()); \
*iter != *(iter##end); ++(*iter))
在 for 范围的位置。有机会使用新的语句范围,还是我必须使用这种宏?