gpt4 book ai didi

c++ - while 循环中的智能指针测试 : use the comma operator?

转载 作者:行者123 更新时间:2023-11-27 23:18:21 25 4
gpt4 key购买 nike

我最近看到这样的代码:

// 3rd Party API: (paraphrased)
void APIResetIterator(int ID); // reset iterator for call to next()
Mogrifier* APINext(int ID); // User must delete pointer returned

...

typedef std::unique_ptr<Mogrifier> MogPtr;

...

const it listID = 42;
APIResetIterator(listID);
MogPtr elem;
while (elem.reset(APINext(listID)), elem) {
// use elem
}

这是个好主意吗?有用吗?


为了方便引用,我会加上相应的for循环:

for (MogPtr elem(APINext(listID)); elem; elem.reset(APINext(listID));) {
// use elem
}

... 也不是真正的最佳选择...

最佳答案

正如其他答案中所说:这在技术上是可以的,并且可以按预期工作。但是你质疑它实际上表明它不是一个好主意,因为它缺乏可读性。

这是一种伪装的 for 循环,类似于这个:

int i = -1;
while (++i, i<10) { something(i); }

换句话说,您可以通过实际使用 for 循环使其更清晰:

for (MogPtr elem{APINext(listID)}; elem != nullptr; elem.reset(APINext(listID)))
{
// use elem
}

唯一的问题是您必须键入 APINext 两次(震惊!)这可能是有人按现在的方式编写它的原因。

经验教训:可读性胜过懒惰。

编辑:在我看来,键入 APINext(listID) 两次实际上是一件好事,因为它清楚表明第一次实际上是初始化,其他时候,这是重新分配。

Edit2: Iterator/Next() 组合在 C++ 中可能看起来有点不寻常,因为 C++ 标准库迭代器使用运算符重载。在 Java 和其他没有运算符重载的语言中,这是正常的处理方式。如果需要,您可以编写一个简单的 C++ 样式的前向迭代器来包装 API 调用:

class MogrifierIterator {
MogPtr ptr_;
int listID_
public:
MogrifierIterator() : ptr_(nullptr) {} //end-Iterator
explicit MogrifierIterator(int listID) : ptr(nullptr), listID_(listID) {
APIResetIterator(listID_);
ptr_.reset(APINext(listID_));
}

Mogrifier& operator*() { return *ptr_; }
Mogrifier* operator->() { return ptr_.get(); }
MogrifierIterator& operator++() { ptr_.reset(APINext(listID_)); return *this; }

bool operator==(MogrifierIterator const& other)
{ return (ptr_==other.ptr_) && (ptr_ == nullptr || listID_ == other.listID_); }
};

//...
for (MogrifierIterator it(listID); it != Mogrifieriterator(); ++it)
{
it->mogrify();
}

它不完整,我还没有测试它,它可能包含错误,但你明白了要点:)

关于c++ - while 循环中的智能指针测试 : use the comma operator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15022085/

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