他の回答で述べたように、これは技術的には問題なく、意図したとおりに機能します。しかし、あなたが疑問に思っていることは、読みやすさに欠けているため、実際には良い考えではないことを示しています.
これは、次のような偽装 for ループのようなものです。
int i = -1;
while (++i, i<10) { something(i); }
つまり、実際に for ループを使用することで、より明確にすることができます。
for (MogPtr elem{APINext(listID)}; elem != nullptr; elem.reset(APINext(listID)))
{
// use elem
}
唯一のことは、2 回入力しなければならないことですAPINext
(ショック!) これが、おそらく誰かが現在のように書いた理由です。
得られた教訓: 読みやすさは怠惰よりも重要です。
編集: imo、実際には2回入力するのは良いことです.1APINext(listID)
回目は実際には初期化であり、2回目は再割り当てであることが明確になるからです.
Edit2: C++ 標準ライブラリの反復子は演算子のオーバーロードで動作するため、このIterator/Next()
組み合わせは C++ では少し変わっているように見えるかもしれません。演算子のオーバーロードがない Java やその他の言語では、これが通常の方法です。必要に応じて、API 呼び出しをラップする単純な C++ スタイルの前方反復子を作成できます。
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();
}
完全ではありません。テストしていないため、エラーが含まれている可能性がありますが、要点はわかります:)