, << std::ostream& .
template <typename C>
std::ostream& operator<<(std::ostream& os, const C& c) {
os << "[";
for (const auto& v : c) {
os << v << " ";
}
os << "]";
return os;
}
os << "[", operator<< ; . operator<<, , operator<<.
- , print_collection:
template <typename C>
void print_collection(std::ostream& os, const C& c) {
os << "[";
for (const auto& v : c) {
os << v << " ";
}
os << "]";
}
operator<<, . :
template <typename C>
std::ostream& operator<<(std::ostream& os, const std::vector<C>& c) {
os << "[";
for (const auto& v : c) {
os << v << " ";
}
os << "]";
return os;
}
, operator<< std::vector, .
, , operator<<, . - :
template <typename Iter>
class Range {
Iter begin_;
Iter end_;
public:
Range() = default;
Range(Iter begin, Iter end)
: begin_{ begin }
, end_{ end }
{}
auto begin() const { return begin_; }
auto end() const { return end_; }
};
template <typename Iter>
auto range(Iter begin, Iter end) {
return Range<Iter>{ begin, end };
}
template <typename C>
auto range(const C& collection) {
return range(std::begin(collection), std::end(collection));
}
template <typename Iter>
std::ostream& operator<<(std::ostream& os, const Range<Iter>& range) {
os << "[";
for (const auto& v : range) {
os << v << " ";
}
os << "]";
return os;
}
:
std::vector<int> vec = ...;
std::cout << range(vec);