それをしてはいけない。代わりにできることは、文字列を引数として取るマニピュレータです。
std::cout << toggle(str);
std::cin >> toggle(str);
マニピュレータはいわゆるシンタックス シュガーです。例えば、
std::cout << std::setw(5) << x <<;
と同じことをします
std::cout.width(5);
std::cout << x;
<<
しかし、他の操作と一緒に連鎖できるため、より便利です。
現在、必要なものの書式設定サポート (小文字と大文字の入れ替え) がないため、そのための構文糖衣を提供する方法もありません。
ただし、マニピュレータが文字列を引数として受け取ることができる場合は、もちろん、マニピュレータ実装の標準的な方法で実装された目的を達成できます。例えば、
struct toggle_output
{ std::string const&str; }
inline toggle_output toggle(std::string const&str)
{ return {str}; }
inline std::ostream& operator<<(std::ostream&out, toggle_output const&t)
{
for(auto c:t.str)
if (std::islower(c)) out<<std::toupper(c);
else if(std::isupper(c)) out<<std::tolower(c);
else out<<c;
return out;
}
struct toggle_input
{ std::string &str; }
inline toggle_input toggle(std::string&str)
{ return {str}; }
inline std::istream& operator>>(std::istream&in, toggle_input &t)
{
in >> t.str;
for(auto&c:t.str)
if (std::islower(c)) c=std::toupper(c);
else if(std::isupper(c)) c=std::tolower(c);
return in;
}
あなたも必要かもしれません(混乱を避けるために)
inline std::ostream& operator<<(std::ostream&out, toggle_input const&t)
{ return out<<toggle_output(t.str); }