ホームページ > バックエンド開発 > C++ > カスタム C 型を範囲ベースの For ループで動作させるにはどうすればよいですか?

カスタム C 型を範囲ベースの For ループで動作させるにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-26 13:03:10
オリジナル
998 人が閲覧しました

How Can I Make My Custom C   Types Work with Range-Based For Loops?

範囲ベースの For ループと互換性のあるカスタム型を作成する

C 11 では、範囲ベースの for ループにより反復処理に便利な構文が提供されます。シーケンス内の要素。カスタム型がこれらのループで動作できるようにするには、次のガイドラインに従ってください:

begin() と end() の作成 メンバー:

メンバー関数の定義 beginカスタムタイプの ()end()。これらの関数は、型内の反復に必要な操作をサポートする反復子オブジェクトを返す必要があります。

型の名前空間で begin() と end() を宣言します。

Ifカスタムタイプは特定の名前空間 (xml など) に属し、begin() を定義し、 xml 名前空間または std 名前空間の end()

または、無料関数を作成します。

型を直接変更できない、または変更したくない場合は、無料の関数を作成してくださいbegin()end() は、型と同じ名前空間にあります。これらの関数は引数として型への参照を取る必要があることに注意してください。

イテレータの要件:

返されるイテレータ オブジェクトは完全なイテレータである必要はありませんが、次の必須要件を満たす必要があります:

  • インクリメントをサポートするためにオーバーロードされた前置演算子iterator
  • 有効な初期化式
  • ブールコンテキストで比較するためのバイナリ != 演算子
  • 逆参照して変数に代入する単項 * 演算子

追加考慮事項:

  • 開始/終了型と遅延終了評価: C の以前のバージョンでは、 begin() と end() は同じ型の反復子を返さなければなりません。以降のバージョン (c 17 以降) では、型を分離して、遅延終了評価を可能にし、終了反復子が真の終了反復子の代わりにセンチネルとして機能するようにすることができます。ループ展開:
  • 範囲式が std 名前空間の値を返さない限り、範囲ベースの for ループは std::begin() を呼び出しません。
  • rvalue 参照:
  • イテレータ オブジェクトは auto&& 変数に格納されるため、一時的な (rvalue) を反復しているかどうかを検出できません。
  • これらのガイドラインに従うことで、範囲ベースの for ループでカスタム型を便利に使用できるようになり、コードの可読性が向上し、コードが簡素化されます。反復操作。

以上がカスタム C 型を範囲ベースの For ループで動作させるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート