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

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

DDD
DDDオリジナル
2024-12-19 22:33:16778ブラウズ

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

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

カスタム データ型で範囲ベースの for ループを使用できるようにするには、次のようにします。 2 つの主なオプションがあります:

  • begin() とend() メンバー関数:
    イテレータを返すカスタム型内にメンバー関数 begin() と end() を実装します。
  • 自由な begin() 関数と end() 関数を作成します:
    カスタム型と同じ名前空間で begin() と end() という名前の自由関数を定義し、型を引数として受け取り、返しますiterators.

名前空間に関する考慮事項:

カスタム型が xml などの名前空間に存在する場合は、begin() と end() を宣言する必要があります。その名前空間内でも同様に機能します。 xml::begin() または std::begin() を指定する必要はありません。

メソッドの要件:

begin/end 戻り値は、実際のイテレータである必要があります。ただし、特定の要件に従う必要があります。

  • 事前インクリメント ( ) をサポート
  • 有効な初期化式を提供する
  • ブール値に対してバイナリ不等号 (!=) を実装する比較
  • 公開するdestructor

範囲ベースの for ループ展開:

範囲ベースの for ループ構文 for (range_declaration : range_expression) は、次の疑似コードに展開されます。

{
  auto &range = range_expression;
  for (auto begin = begin_expr, end = end_expr; begin != end; ++begin) {
    range_declaration = *begin;
    loop_statement
  }
}

C 17 の分離された終了型:

C 17 では、範囲ベースの for ループ拡張疑似コードが次のように変更されました:

{
  auto &range = range_expression;
  auto begin = begin_expr;
  auto end = end_expr;
  for (; begin != end; ++begin) {
    range_declaration = *begin;
    loop_statement
  }
}

この変更により、終了反復子の型を開始反復子と異なるようにすることができます。イテレータ型。これにより、begin イテレータ型との不平等比較のみをサポートする「センチネル」イテレータの使用が可能になります。

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

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