Search code examples
c++loopssmart-pointerscomma-operator

Smart pointer test in a while loop: use the comma operator?


I recently saw code like this:

// 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
}

Is this a good idea? Does it work?


I'll add the corresponding for loop for easy reference:

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

... doesn't strike me as really optimal either ...


Solution

  • Maybe we should write it as:

    template<class SPT, typename P>
    SPT& reset(SPT& smartPtr, P ptr) {
      smartPtr.reset(ptr);
      return smartPtr;
    }
    
    for (MogPtr elem; reset(elem, APINext(listID));) {
      // use elem
    }