Skip to content

Latest commit

 

History

History
74 lines (56 loc) · 2.43 KB

enable_view.md

File metadata and controls

74 lines (56 loc) · 2.43 KB

enable_view

  • 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であることは、Tviewであるための必要条件である。

viewコンセプトの要件は意味論要件がメインなため、view_baseを基底クラスにするか、enable_viewを特殊化することで、明示的にviewであることを示すようになっている。

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; // 説明専用
}
  • see below[italic]

is-derived-from-view-interface<T>は、Tがある型Uについてただ一つだけview_interface<U>publicな基底クラスに持ち、他の型Vについてのview_interface<V>を基底クラスに持たない場合にtrueとなる。

多くの場合U = Tであり、その場合Tview_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]

参照