gpt4 book ai didi

c++ - 重新 C++ 范围迭代器 : Is it bad to have just one class?

转载 作者:行者123 更新时间:2023-11-28 03:23:52 24 4
gpt4 key购买 nike

例如是否应将以下类分成两部分:

class Range {
public:
Range(int end);

Range begin();
Range end();

// Second class would contain these methods.
bool operator!=(const Range& range);
int operator*();
void operator++();
};

// Print 012
// Almost as pretty as Python :D
for (int i : Range(3)) {
std::cout << i;
}

?

PS:标准库中有这样的类吗?

更新:

这是替代设计的样子:

class Range;

class RangeIterator {
public:
bool operator!=(const RangeIterator& range_iterator);
int operator*();
void operator++();

private:
RangeIterator(const Range& range);
};

class Range {
public:
Range(int end);

RangeIterator begin();
RangeIterator end();

friend class RangeIterator;
};

最佳答案

我个人会把它分开——C++ 中类型安全的要点是当你将一个范围传递给一个应该采用迭代器的函数时,编译器会告诉你关闭,反之亦然。如果同一个类执行这两个角色,那么你就失去了这个,如果 myrangemyrange.begin() 有相同的类型,这是一个现实的错误。也就是说,由于您也喜欢 Python,您可能不会认为这有什么大不了的,您已经习惯了 __iter__ 返回 self 的对象。从 C++ 视角来看,我会说这可能看起来有点不寻常/棘手/聪明。

但这并不意味着 RangeIterator 必须在您的界面中公开定义。您可以使用由私有(private)嵌套类或命名空间中定义的类支持的 typedef Range::iterator_type。无论哪种方式,有人都可以检查头文件中的类定义,但除了“可以通过名称 Range::iterator_type 引用它,这是您可以用它做的事情”之外,您不会记录任何内容。

说到这里,RangeRangeIterator 目前都不满足迭代器要求。如果您决定要让 Iterator 成为迭代器,那么您要么需要专门化 std::iterator_traits,添加一些 typedef,要么(常见选项)派生自 std::迭代器。因此,无论您采用哪种方式,都需要包含更多的样板文件。这可能会影响你的决定。开始时需要编写的内容越多,按比例定义额外类的成本就越低。

这里的 RangeIterator 变成了一个迭代器:

class RangeIterator : public std::iterator<std::input_iterator_tag, int> {
public:
bool operator!=(const RangeIterator& range_iterator) const;
bool operator==(const RangeIterator& range_iterator) const;
int operator*() const;
RangeIterator &operator++();
RangeIterator operator++(int);

private:
RangeIterator(const Range& range);
};

关于c++ - 重新 C++ 范围迭代器 : Is it bad to have just one class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14682197/

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