Если вы хотите выводить элементы структуры, то пусть самурая - переопределить
operator<<
примерно так:
std::ostream operator<<(std::ostream& os, const S1& s) {
os << "s.a: " << s.a << ", s.b: " << s.b;
}
Шаблон вам здесь не пригодится, поскольку только ваша структура содержит поля a и b.
Любой другой класс/структура содержит другие поля, а соответственно, данная шаблонная функция вызовет ошибку компиляции для них из-за отсутствия соответствующих полей.
Шаблоны полезны там, где есть общий интерфейс, например, можно написать шаблонную функцию, которая проходится по контейнеру и выводит его значения (поскольку многие STL контейнеры итерируемы и этот функционал имеет единый интерфейс)