gpt4 book ai didi

c++ - ostream operator<< 为采用 STL 容器而重载,传递 std::string 会破坏它吗?

转载 作者:行者123 更新时间:2023-11-27 22:37:29 25 4
gpt4 key购买 nike

所以我重载了 ostream << 运算符,这样它就可以使用大多数 STL 容器并打印它们。但是,它不适用于传递字符串(错误是“cout << s;”行的“模糊重载”)。我如何让它在字符串上工作就好像它没有重载

#include <bits/stdc++.h>
using namespace std;

template<typename T>
ostream& _containerprint(ostream &out, T const &val) {
return (out << val << " ");
}

template<typename T1, typename T2>
ostream& _containerprint(ostream &out, pair<T1, T2> const &val) {
return (out << "{" << val.first << " " << val.second << "} ");
}

template<template<typename, typename...> class TT, typename... Args>
ostream& operator<<(ostream &out, TT<Args...> const &cont) {
for(auto&& elem : cont) {
_containerprint(out, elem);
}
return out;
}

int main() {
string s = "help me";
cout << s;
}

编辑:请停止 panic ,#include <bits/stdc++.h>是因为它是为编程竞赛设置的;真的没关系!

最佳答案

std::string是一个模板类(std::basic_string<char> 的别名)

所以 std::cout << s匹配您的重载和 std::basic_string<T> 的重载.

并且没有一个重载比另一个更专业。

可能的解决方法是为 std::string 添加额外的重载:

std::ostream& operator << (std::ostream& out, const std::string& s)
{
return operator << <char>(out, s);
// Select template <class CharT, class Traits, class Allocator>
// std::basic_ostream<CharT, Traits>&
// operator<<(std::basic_ostream<CharT, Traits>& os,
// const std::basic_string<CharT, Traits, Allocator>& str);
}

Demo

关于c++ - ostream operator<< 为采用 STL 容器而重载,传递 std::string 会破坏它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52410319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com