Namespaces
Variants

std::define_static_array

ja.cppreference.net より
 
 
 
リフレクションライブラリ
 
リフレクション型とクエリ
リフレクションクエリ
リフレクションレイアウトクエリ
型プロパティ
型プロパティクエリ
 
ヘッダ <meta>
template< ranges::input_range R >
consteval std::span<const ranges::range_value_t<R>> define_static_array( R&& r );
で定義 (C++26以上)

配列を静的ストレージに昇格させる。

N を、static_cast<std::size_t>(ranges::size(r)) が定数式である場合は ranges::size(r)、そうでない場合は std::dynamic_extent とする。効果は以下と等価である:

using T = ranges::range_value_t<R>;
std::meta::info array = std::meta::reflect_constant_array(r);
if (std::meta::is_array_type(std::meta::type_of(array)))
    return std::span<const T, N>(std::meta::extract<const T*>(array),
                                 std::meta::extent(std::meta::type_of(array)));
else
    return std::span<const T, N>(static_cast<const T*>(nullptr), 0);

引数

r - input_range 。その要素はコピー構築可能であり、structural type

を持つ。

戻り値rのサイズがゼロでない場合、型 const T[N] の配列から構築されたスパン(ただしT は ranges::range_value_t<R>、N は r のサイズ)。配列の各要素は、std::meta::reflect_constant(static_cast<T>(*it)) が表す値またはオブジェクトから初期化される。ここで it は r の対応する要素へのイテレータである。

そうでない場合(r のサイズがゼロ)、空のスパン。

注記

テンプレート引数オブジェクトとして、結果の配列オブジェクト(存在する場合)は静的ストレージ期間を持つ。template-argument-equivalent な内容を持つレンジは、同じ配列オブジェクトに対応する。

配列オブジェクトは潜在的に一意でないオブジェクトである。

機能テストマクロ 値 標準 機能
__cpp_lib_define_static 202506L (C++26) std::define_static_array

例

#include <algorithm>
#include <meta>
#include <print>
#include <vector>

constexpr std::vector<double> precompute_angles(std::size_t size)
{
    std::vector<double> angles(size);
    for (int i{}; double& angle : angles)
        angle = 360.0 / size * i++;
    
    return angles;
}

consteval std::span<const double> precompute_angles_arr(std::size_t size)
{
    std::vector<double> angles = precompute_angles(size);
    return std::define_static_array(angles);
}

int main()
{
    // std::vector<double> angles = precompute_angles(7);
    //     error: call to consteval function ‘precompute_angles(7)’ is not a constant
    //            expression because it refers to a result of ‘operator new’

    std::span<const double> angles = precompute_angles_arr(7);
    for (double angle : angles)
        std::print("{:.1f} ", angle);

    std::println();
}

出力:

0.0 51.4 102.9 154.3 205.7 257.1 308.6

関連項目

コンパイル時文字列を静的ストレージに昇格させ、静的文字列の最初の文字へのポインタを返す
(関数テンプレート)
コンパイル時の値を静的ストレージに昇格させ、静的オブジェクトへのポインタを返す
(関数テンプレート)
コンパイル時配列を静的ストレージに昇格させ、静的配列を表すリフレクションを返す
(関数テンプレート)