最終更新日時(UTC): 2025年07月14日 14時04分00秒
Koichi Murase が更新

履歴 編集

variable
<ranges>

# std::ranges::enable_view(C++20)

    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`であることを示すようになっている。

## 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`を複数継承階層の中に持っているとこれを満たすことができなくなる。

## 例

    #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>);
    }

### 出力

## バージョン

### 言語

- 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_interface` is overspecified to derive from `view_base`