次の方法で共有


empty_view クラス (C++ 標準ライブラリ)

要素のないビュー。 このビューは、ビューで提供する必要があるが、基になるデータにアクセスする必要がないコードを呼び出すなどのテスト目的で役立ちます。

構文

template<class T>
    requires std::is_object_v<T>
class empty_view : public ranges::view_interface<empty_view<T>>;

テンプレート パラメーター

T
要素の型。 empty_viewに要素がない場合でも、すべての範囲は同種です。 つまり、特定の型の要素があります。 したがって、empty_viewに要素がない場合でも、intempty_viewstringsなどの型がまだ存在します。

特性の表示

以下の項目の説明については、 View クラスの特性を参照してください。

特徴 説明
範囲アダプター views::empty
基になる範囲 なし
要素の種類 empty_viewの作成時に指定したとおり
反復子カテゴリの表示 contiguous_range
サイズ はい。 常に 0 を返します
const対応 はい
共通範囲 はい
借用範囲 はい

メンバー

メンバー関数 説明
コンストラクターC++20 empty_view を構築します。
beginC++20 nullptr を返します。
endC++20 nullptr を返します。
sizeC++20 0 を返します。
継承の対象 view_interface 説明
backC++20 未定義の動作になります。
dataC++20 nullptr を返します。
emptyC++20 true を返します。
frontC++20 未定義の動作になります。
operator[]C++20 未定義の動作になります。
operator boolC++20 false を返します。

解説

empty_viewを作成する最善の方法は、empty範囲アダプターを使用することです。 範囲アダプターは、ビュー クラスを作成するための目的の方法です。 独自のカスタム ビューの種類を作成する場合は、ビューの種類が公開されます。

empty_viewには要素を含めないため、特定のコンパイラの最適化が可能です。 たとえば、繰り返し処理するものが何もないことを認識しているため、コンパイラは for (auto e : std::views::empty<int>) {...} を排除します。

empty_viewのもう 1 つの用途は、split_viewempty_view区切り記号で分割することです。その結果、1 つの要素範囲の範囲になります。

要件

Header: <ranges> (C++20 以降)

名前空間: std::ranges

コンパイラ オプション: /std:c++20 以降が必要です。

コンストラクター

empty_view のインスタンスを作成します。

template<class T>
inline constexpr empty_view<T> empty{};

パラメーター

T
基になる要素の型。いずれも存在しません。

解説

empty_viewを作成する最善の方法は、empty範囲アダプターを使用することです。

empty_view

// requires /std:c++20 or higher
#include <ranges>
#include <iostream>

int main()
{
    auto anEmptyView = std::views::empty<int>;
    bool isNotEmpty = (bool)anEmptyView;
    std::cout << std::boolalpha << isNotEmpty << "\n"; // false
    std::cout << std::boolalpha << anEmptyView.empty(); // true
}
false
true

back

未定義の動作になります。

constexpr auto back()
    requires ranges::bidirectional_range<T> && ranges::common_range<T>;

constexpr auto back() const
    requires ranges::bidirectional_range<const T> && ranges::common_range<const T>;

パラメーター

ありません。

戻り値

ありません。

解説

デバッグ ビルドでこの関数を呼び出すと、空の view_interfaceで関数が呼び出されたというアサーションが生成されます。

begin

ビューに最初の要素がないため、 nullptr を返します。

static constexpr T* begin() noexcept

戻り値

nullptr

data

ポインターを取得するビューの最初の要素がないため、 nullptr を返します。

static constexpr T* data() noexcept

戻り値

nullptr.

empty

派生ビューが空かどうかをテストします。

static constexpr bool empty() noexcept

パラメーター

ありません。

戻り値

true を返します。

end

ビューに要素がないため、 nullptr を返します。

static constexpr T* end() noexcept

戻り値

nullptr.

front

未定義の動作になります。

constexpr auto front()
    requires ranges::forward_range<T>;
constexpr auto front() const
    requires ranges::forward_range<const T>;

パラメーター

ありません。

戻り値

ありません。

解説

デバッグ ビルドでこの関数を呼び出すと、空の view_interfaceで関数が呼び出されたというアサーションが生成されます。

operator[]

未定義の動作になります。

template<ranges::random_access_range R = T>
constexpr decltype(auto) operator[](ranges::range_difference_t<R> pos);

template<ranges::random_access_range R = const T>
constexpr decltype(auto) operator[](ranges::range_difference_t<R> pos) const;

パラメーター

pos
返される要素の開始反復子を基準とした位置。

戻り値

ありません。

解説

デバッグ ビルドでこの関数を呼び出すと、インデックスが view_interfaceの範囲外であるというアサーションが発生します。

operator bool

派生ビューが空でないかどうかをテストします。

constexpr explicit operator bool()
requires requires { ranges::empty(T ()); };

constexpr explicit operator bool() const
requires requires { ranges::empty(T ()); };

パラメーター

ありません。

戻り値

false を返します。

(bool)

// requires /std:c++20 or higher
#include <ranges>
#include <iostream>

int main()
{
    auto anEmptyView = std::views::empty<int>;

    if (anEmptyView) // check if anEmptyView isn't empty
    {
        std::cout << "Error: why does an empty_view have elements?\n";
    }
    else
    {
        std::cout << "Correct: an empty_view is not not empty\n";
    }
}
Correct: an empty_view is not not empty

size

ビュー内の要素の数を取得します。これは常に 0 になります。

static constexpr size_t size()

パラメーター

ありません。

戻り値

0.

関連項目

<ranges>
empty 範囲アダプター
single_view
クラスの表示