Namespaces
Variants

std::ranges::ssize

ja.cppreference.net より
 
 
Ranges ライブラリ
Range アダプタ
 
ヘッダ <ranges>
で定義<iterator>
inline namespace /* unspecified */ {
    inline constexpr /* unspecified */ ssize = /* unspecified */;
}
ヘッダ
で定義
(C++20 以上)
template< class T >
    requires /* see below */
constexpr auto ssize( T&& t );
(カスタマイゼーションポイントオブジェクト)

呼び出しシグネチャt(C++20 以上)

内の要素数を定数時間で計算し、その結果を符号付き型に変換します。 を表すt (おそらく具体化された) 結果オブジェクトを E とすると:

  • もし ranges::size(t) が ill-formed ならば、ranges::ssize(E) も ill-formed です。
  • そうでなければ、Signed を make-signed-like-t <decltype(ranges::size(t))> とします:
    • もし std::ptrdiff_t が Signed より幅広いならば、ranges::ssize(E) は式等価であり static_cast<std::ptrdiff_t>(ranges::size(t)) に相当します。
    • そうでなければ、ranges::ssize(E) は式等価であり static_cast<Signed>(ranges::size(t)) に相当します。

カスタマイゼーションポイントオブジェクト

名前 ranges::ssize は カスタマイゼーションポイントオブジェクト を表し、これは 関数オブジェクト のconstな リテラル semiregular クラス型です。詳細は CustomizationPointObject を参照してください。

注記

式 ranges :: ssize ( e ) が有効な場合、戻り値の型は signed-integer-like type です。

例

#include <array>
#include <iostream>
#include <ranges>
#include <type_traits>
int main()
{
    std::array arr{1, 2, 3, 4, 5};
    auto s = std::ranges::ssize(arr);
    std::cout << "ranges::ssize(arr) = " << s << '\n'
              << "ranges::ssize is "
              << (std::is_signed_v<decltype(s)> ? "signed" : "unsigned")
              << '\n';
    std::cout << "reversed arr: ";
    for (--s; s >= 0; --s)
        std::cout << arr[s] << ' ';
    std::cout << "\n" "s = " << s << '\n';
}

出力:

ranges::ssize(arr) = 5
ranges::ssize is signed
reversed arr: 5 4 3 2 1
s = -1

欠陥報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3403 C++20 ranges::size は一部の非レンジ型で動作したが ranges::ssize は動作しなかった 動作するように修正

関連項目

範囲のサイズに等しい整数を返す
(カスタマイゼーションポイントオブジェクト)
範囲が定数時間で自身のサイズを知ることを指定する
(コンセプト)
イテレータとセンチネル間、または範囲の先頭と終端間の距離を返す
(アルゴリズム関数オブジェクト)
(C++17) (C++20)
コンテナまたは配列のサイズを返す
(関数テンプレート)