But there's nothing stopping you from swapping that out too. Go aheadand add a Communicator::swap() method.
That's effectively going to be the final design, I'm afraid - either anew optional constructor argument or a new Communicator getter/setter
method for most of the big parallel objects.
I hadn't planned on actually taking that step any time soon, but I
could push it up the TODO list if you'd find it useful.