C++17 は (おそらく) loop の範囲の定義を緩和しend()
、異なる型 (例: センチネル) を返せるようにします:
struct MyRange {
struct Sentinel {};
int* begin();
Sentinel end();
};
bool operator!=(int*, MyRange::Sentinel);
現在、これをサポートしているコンパイラは gcc 6.1 と clang 4.0+ (例) (エラー メッセージの例) のみです。センチネルが最後の型に対してより効率的な範囲型を作成している場合、コンパイラが緩和された範囲をサポートしているかどうかをどのように検出できますか? P0184R0 (上記のリンク) では、これに関する議論は見られません。機能テスト マクロは提供されますか?
その他の質問:
- コンパイラのサポートを検出する方法がある場合、
end()
メンバー関数の戻り値の型を変更しても (ライブラリにとって) 安全ですか? たとえば、センチネルを暗黙的にイテレータ型に変換できるようにする必要がありますか? - 逆に、C++17 より前のコンパイラの場合、センチネルを別の名前 (例:
sentinel()
) で公開する価値はありますか? C++17 より前のアルゴリズムは効率的に使用できます[begin(), sentinel())
か、それともコードを追加する価値はありませんか?