カスタム型による反復の簡素化
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 サイトの他の関連記事を参照してください。