Для этих классов-оболочек без сохранения состояния может быть лучше использовать статические функции-члены:
template<typename T, typename OutStream = std::ostream>
struct printer
{
static OutStream & print()(T const &toPrint, OutStream &outStream = std::cout)
{
outStream << toPrint;
return outStream;
}
};
Затем вы можете вызывать их с помощью printer<Foo>::print(x);
, и вы обычно можете предоставить шаблон вспомогательной функции для определения типа:
template <typename T> std::ostream & print(T const & x)
{
return printer<T, std::ostream>::print(x);
}
Теперь вы можете просто сказать print(x);
.