ストリーム挿入演算子と抽出演算子
>を使って、独自の型をstd::coutと連携できるようにします。
「ストリーム挿入演算子と抽出演算子」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
<<と>>をオーバーロードする理由
ストリーム演算子をオーバーロードして、独自の型をstd::coutやstd::cinと連携できるようにします。
挿入演算子<<
出力ストリームを参照で受け取る非メンバー関数として定義します。ストリームを返すことで、演算を連鎖できるようにします。
struct Point { int x, y; };
std::ostream& operator<<(std::ostream& os, const Point& p) {
return os << "(" << p.x << ", " << p.y << ")";
}
Point p{3, 4};
std::cout << p << "\n"; // (3, 4)なぜ非メンバー関数なのか
メンバー関数として記述すると、左オペランドはPointでなければなりません。しかし、左側にはstd::ostreamが必要なので、それは不可能です。非メンバー関数なら、どちらの順序にも対応できます。
抽出演算子>>
入力ストリームから読み取るために定義します。入力を検証し、失敗した場合はfailbitを設定します。
std::istream& operator>>(std::istream& is, Point& p) {
char open, comma, close;
is >> open >> p.x >> comma >> p.y >> close;
if (open != '(' || comma != ',' || close != ')')
is.setstate(std::ios::failbit);
return is;
}ストリームの失敗状態を設定する
解析に失敗した場合は、is.setstate(std::ios::failbit)を呼び出します。呼び出し側は!isまたはis.fail()で失敗を検出できます。
friend宣言
演算子からprivateメンバーにアクセスする必要がある場合は、クラス内でfriendとして宣言します。
class Point {
int x_, y_;
public:
friend std::ostream& operator<<(std::ostream& os, const Point& p);
};ストリーム型のテンプレート化
最大限の移植性を確保するには、文字型をテンプレート引数にします。ワイド文字ストリームに便利です。
template <typename CharT>
std::basic_ostream<CharT>& operator<<(
std::basic_ostream<CharT>& os, const Point& p) {
return os << "(" << p.x << ", " << p.y << ")";
}連鎖
ストリームを返すと、演算を連鎖できるようになります。
std::cout << "Result: " << point << ", distance: " << dist;カスタムフォーマット
高度なフォーマットにはstd::ios::fmtflagsやC++20のstd::formatを使用します。ストリームはより簡単ですが、ローカライズは難しくなります。
JSON形式の出力
演算子内でフォーマット方法を組み合わせることができます。複雑な出力では、ヘルパー関数を作成してください。
複数行の読み取り
行単位の読み取りにはstd::getlineを使用し、その後stringstreamで解析します。これにより、operator>>をシンプルに保てます。
パフォーマンスのヒント
非常に高スループットのロギングでは、専用ライブラリ(spdlog、fmt)を使用してください。ストリームより大幅に高い性能を得られます。
簡単な確認
ユーザー定義型のoperator<<は、なぜメンバー関数ではなく非メンバー関数として定義するのですか?
まとめ
operator<<とoperator>>は、ストリームを参照で受け取る非メンバー関数としてオーバーロードします。ストリームを返して連鎖できるようにします。解析エラーが発生したらfailbitを設定します。privateメンバーへのアクセスが必要な場合はfriendを使用します。
よくある質問
「ストリーム挿入演算子と抽出演算子」レッスンは無料ですか?
はい。「ストリーム挿入演算子と抽出演算子」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「ストリーム挿入演算子と抽出演算子」で何を学びますか?
>を使って、独自の型をstd::coutと連携できるようにします。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ストリーム挿入演算子と抽出演算子」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 算術演算子と比較演算子
- ストリーム挿入演算子と抽出演算子
- 添字演算子と関数呼び出し演算子
- 三方比較演算子(C++20)