I'd omit printing the comma by treating the first element special:
if (!pdata->empty()) {
os << pdata->front();
std::for_each(std::next(pdata->begin()), pdata->end(),
[&os](auto&& v){ os << ", " << v; });
}
Obviously, this code goes into a function printing a printable range adapter.