так что разница в дизайне "log_destination делаем в виде классовой иерархии, а потоки в виде (условно скажем) шаблонного оператора" имеется,
и происходит она из-за причины, которую ты очень-очень вряд ли сможешь четко и ясно изложить в правиле, а если и сможешь -- младшие программисты все равно смогут с тобой спорить на тему "нет, это правило у нас сейчас не приложимо"
в то время как достоинства и недостатки языковых средств весьма близки к объективным -- в особенности ответ на вопрос "проверяет ли эту хрень компилятор" на 99% объективен (оставшиеся 1% необъективности отнесен на случай возможности проверки только с помощью переусложненных шаблонов)