Моя задача — перегрузить operator<<
, чтобы он мог печатать любой объект (например, std::vector
, std::set
, std::map
, std::deque
и т. д.)
С моими базовыми знаниями о шаблонах и поиском в Интернете я получил что-то вроде этого:
template <typename T>
std::ostream& operator<<(std::ostream& stream, const std::vector<T>& v){
stream << '[';
for(const auto& element : v){
stream << element << ' ';
}
stream << ']';
return stream;
}
int main(){
std::vector<double> foo = {1.2, 2.1, 3.56};
std::set<double> roo = {1.2, 2.1, 3.56};
std::cout << foo << std::endl;
std::cout << roo << std::endl;
}
Но он не будет печатать std::set
или любой другой объект. Я пытался заменить const std::vector<T>& v
на const T& v
, но он не компилируется. Любые советы о том, как я могу подойти к этой проблеме?
Я пытался заменить
const std::vector<T>& v
наconst T& v
, но он не компилируется.
Вы можете наложить ограничения на тип, чтобы избежать конфликта с перегруженным operator<<
, предоставляемым библиотекой. Например.
// works on types supporting std::begin and std::end
template <typename T>
auto operator<<(std::ostream& stream, const T& v) -> decltype(std::begin(v), std::end(v), stream) {
stream << '[';
for(const auto& element : v){
stream << element << ' ';
}
stream << ']';
return stream;
}