gpt4 book ai didi

c++ - 点迭代器的奇怪接口(interface)方法

转载 作者:行者123 更新时间:2023-11-28 05:31:00 25 4
gpt4 key购买 nike

我必须遍历周边矩形的特定点(在某些情况下,我需要遍历该矩形的一行,在其他情况下,我需要遍历整个矩形)。我有一个接口(interface) PointIterator。

struct Point
{
double x,y
}
class PointIteratorI
{
virtual void next() =0;
virtual void isOver() =0;
virtual Point& getPoint() = 0;
}

如果遍历一行

class LineIterator:public PointIterator
{
....
}

在遍历矩形的周长的情况下

class PerimeterIterator:public PointIterator
{
....
}

如果是 LineIterator,我还需要线的类型(水平或垂直,矩形有 2 条水平线和 2 条垂直线)。但是像“getLineType”这样的接口(interface)对于 LineIterator 类型来说很奇怪。似乎此方法不适用于此类。因为在这种情况下,类 LineIterator 将负责迭代和方向。它违反了单一职责原则。

我想到了不同的界面,例如:

class LineObjectI
{
public:
virtual LineType getLineType() = 0;
.....
}
class LineIterator:public PointIterator, public LineObjectI
{
protected:
virtual LineType getLineType() = 0;
....
}

用于隐藏此界面。我想知道是否有更好的方法来检查 LineIterator 上的行类型。

最佳答案

我将争论一个不同的解决方案。抛弃继承。

boost::anystd::any 开始。然后加入type erasure .

以下是迭代器所需的 3 个操作:

const auto increment = make_any_method<void()>( [](auto&&self){++self;} );
const auto equals = make_any_method<bool(boost::any const&), true>( [](auto const&lhs, boost::any const& rhs){
using LHS=std::decay_t<decltype(lhs)> const;
auto prhs = boost::any_cast<LHS>(&rhs);
if (!prhs) return false;
return lhs == *prhs;
} );
template<class T>
const auto deref = make_any_method<T()>( [](auto&&self)->T {return *self;} );

现在用一点 fascade 把这些操作变成一个适当的迭代器:

template<class T,
class Base=super_any<decltype(increment), decltype(equals), decltype(deref<T>)>
>
struct poly_iterator:Base

{
using Base::Base;
using iterator_category = std::input_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
using reference = T;

friend bool operator==( poly_iterator const& lhs, poly_iterator const& rhs ) {
return (lhs->*equals)(rhs);
}
friend bool operator!=( poly_iterator const& lhs, poly_iterator const& rhs ) {
return !(lhs==rhs);
}
T operator*() {
return ((*this)->*deref<T>)();
}
poly_iterator& operator++() {
((*this)->*increment)();
return *this;
}
poly_iterator operator++(int) {
std::cout << "i++\n";
auto copy = *this;
((*this)->*increment)();
return copy;
}
};

Live example .

boost 为类型 T 提供了一个类似的类型删除迭代器系统。

一般来说,这种技术对性能有影响,因为在每次增量比较和取消引用时跟踪所有这些函数指针加起来。

对 permiter 的迭代不是迭代的类型,它是迭代的范围。

迭代图形的一条边(线)也是如此。

有 3 种方法可以遍历周边。首先,迭代周长中的线,然后迭代点。

其次,遍历周边的点。

第三,迭代一对 (side_type, point) 或 (side, point),其中 side 具有属性 side_type。

这导致迭代与 range-for 循环和 C++ 算法兼容,消除了使用智能指针的要求,并允许您将迭代器视为值类型。它将类型系统移开:你唯一拥有类型的是你正在迭代的东西,而不是你如何行走的细节。

关于c++ - 点迭代器的奇怪接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39518735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com