正如其他答案中所说:这在技术上是可以的,并且可以按预期工作。但是你质疑它实际上表明这不是一个好主意,因为它缺乏可读性。
这是一种伪装的 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
两次(震惊!),这可能是有人以现在的方式编写它的原因。
经验教训:可读性胜过懒惰。
编辑: imo 输入两次实际上是一件好事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();
}
它不完整,我没有测试它,它可能包含错误,但你明白了要点:)