namespace std::ranges {
template<class T>
inline constexpr bool enable_view = derived_from<T, view_base> || is-derived-from-view-interface<T>;
}
概要
enable_view<T>がtrueであることは、Tがviewであるための必要条件である。
viewコンセプトの要件は意味論要件がメインなため、view_baseを基底クラスにするか、enable_viewを特殊化することで、明示的にviewであることを示すようになっている。
要件
- cv修飾のないプログラム定義型に対して、この変数テンプレートを特殊化することが許可される。
- そのような特殊化は定数式で使用可能であり、
bool型を持つ必要がある。
- そのような特殊化は定数式で使用可能であり、
is-derived-from-view-interface
is-derived-from-view-interface<T>は説明専用のbool型の変数テンプレートである。
namespace std::ranges {
template<class T>
inline constexpr bool is-derived-from-view-interface = see below; // 説明専用
}
is-derived-from-view-interface<T>は、Tがある型Uについてただ一つだけview_interface<U>をpublicな基底クラスに持ち、他の型Vについてのview_interface<V>を基底クラスに持たない場合にtrueとなる。
多くの場合U = Tであり、その場合Tはview_interface<T>をpublicで1つだけ継承していればこれを満たすことができる。継承関係が複雑な型などで、view_interfaceを複数継承階層の中に持っているとこれを満たすことができなくなる。
例
出力
バージョン
言語
- C++20
処理系
- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 6 ✅
参照
- N4861 24 Ranges library
- C++20 ranges
- LWG Issue 3549.
view_interfaceis overspecified to derive fromview_base - LWG Issue 3183. Normative permission to specialize Ranges variable templates
- C++20で、プログラム定義型に対してこの変数テンプレートを特殊化してよいという規範的な許可が明記された