- ranges[meta header]
- std::ranges[meta namespace]
- variable[meta id-type]
- cpp20[meta cpp]
namespace std::ranges {
template<class T>
inline constexpr bool enable_view = derived_from<T, view_base> || is-derived-from-view-interface<T>;
}
- derived_from[link /reference/concepts/derived_from.md]
- view_base[link view_base.md]
enable_view<T>
がtrue
であることは、T
がview
であるための必要条件である。
view
コンセプトの要件は意味論要件がメインなため、view_base
を基底クラスにするか、enable_view
を特殊化することで、明示的にview
であることを示すようになっている。
is-derived-from-view-interface<T>
は説明専用のbool
型の変数テンプレートである。
namespace std::ranges {
template<class T>
inline constexpr bool is-derived-from-view-interface = see below; // 説明専用
}
- see below[italic]
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
を複数継承階層の中に持っているとこれを満たすことができなくなる。
#include <ranges>
int main()
{
using namespace std::ranges;
static_assert(enable_view<view_base>);
static_assert(!enable_view<int>);
struct t : view_base { };
static_assert(enable_view<t>);
}
- enable_view[color ff0000]
- view_base[link view_base.md]
- C++20
- Clang: 13.0.0 [mark verified]
- GCC: 10.1.0 [mark verified]
- ICC: ?
- Visual C++: 2019 Update 6 [mark verified]