Можно использовать перегрузку оператора <<
Можно использовать новомодный
std::input_or_output_iterator или if constexpr
или вовсе явно специализировать/перегрузить шаблон для нужного вам типа.
Вот один из простейших вариантов. Просто добавьте перед функцией main.
template <typename T>
std::ostream& operator<<(std::ostream &os, const S<T>& s)
{
if constexpr (std::ranges::range<T>) {
const auto& val = s.GetVal();
for (const auto& i : s.GetVal()) {
os << i << " ";
}
} else {
os << s.GetVal();
}
return os;
}
Все ещё не универсально, поскольку работает не со всеми контейнерами, а только с теми, которые хранят значения и могут в range_base loop
В таком случае вам больше не нужны функции (если они использовались лишь для вывода информации в консоль)
PrintVal
PrintVector
GetVector
Можно даже избавиться от GetVal, если вам не нужен этот геттер в остальном коде, тогда нужно просто подружить функцию с классом.