ホームページ >バックエンド開発 >C++ >範囲ベースの For ループを使用してカスタム C 型を反復可能にするにはどうすればよいですか?

範囲ベースの For ループを使用してカスタム C 型を反復可能にするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-23 22:03:09610ブラウズ

How Can I Make My Custom C   Types Iterable Using Range-Based For Loops?

カスタム型による反復の簡素化

C 11 では、範囲ベースの for ループの導入により、シーケンスの反復プロセスが簡素化されました。これらのループは標準化されたパターンに従います:

for (Type& v : a) { ... } // equivalent to traditional loop below
for (auto iv = begin(a); iv != end(a); ++iv) {
  Type& v = *iv;
  ...
}

次のガイドラインに従って、この機能をカスタム タイプに拡張して、範囲ベースのループで使用できるようにすることができます:

アプローチ 1 : メンバー関数宣言

  • 次のオブジェクトを返す型 X で begin() および end() メンバー関数を定義します。イテレータのような動作。

アプローチ 2: 自由な関数呼び出し

  • 型 X と同じ名前空間に自由な関数 begin(X&) と end(X&) を作成します。再びイテレータのようなオブジェクトを返します。

これらの関数は必要な初期化を提供します。範囲ベースのループの (begin()) ポイントと終了ポイント (end()) 。

関数の戻り値の要件

begin() と end() によって返されるオブジェクトには必要ありません実際のイテレータになります。ただし、次の要件を満たす必要があります:

  • オブジェクトをインクリメントするために事前にオーバーロードする
  • 有効な初期化式を保証する
  • ブール コンテキストのバイナリ != をサポートする
  • 単項 * を実装してループに割り当て可能な値を返す変数
  • パブリック デストラクターを提供します

追加の考慮事項

  • カスタム型が XML 名前空間に属している場合は、回避するために xml::begin() を定義します。 std::begin() と競合する可能性があります。
  • 将来の C リビジョンでは、 begin() と end() の型を分離し、「遅延終了」評価を可能にします。
  • C 17 では、null で終了する文字バッファに対する範囲ベースのループを容易にする新しい型 null_sentinal_t が導入されました。
  • 範囲ベースのループは、auto&& 参照に格納された一時変数を使用します。つまり、begin() および end() オーバーロードは、それらが動作しているかどうかを検出できません。一時的に。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。