最終更新日時:
が更新

履歴 編集

function
<simd>

std::simd::basic_vec::コンストラクタ(C++26)

constexpr basic_vec() noexcept = default;                  // (1) C++26

template<class U>
constexpr basic_vec(U&& value) noexcept;                   // (2) C++26

template<class U, class UAbi>
constexpr explicit(/*see below*/)
  basic_vec(const basic_vec<U, UAbi>& x) noexcept;         // (3) C++26

template<class G>
constexpr explicit basic_vec(G&& gen);                     // (4) C++26

template<class R, class... Flags>
constexpr basic_vec(R&& r, flags<Flags...> = {});          // (5) C++26

template<class R, class... Flags>
constexpr basic_vec(R&& r, const mask_type& mask,
                    flags<Flags...> = {});                 // (6) C++26

constexpr basic_vec(const real-type& reals,
                    const real-type& imags = {}) noexcept; // (7) C++26

概要

basic_vecオブジェクトを構築する。

  • (1) : デフォルトコンストラクタ。各要素をデフォルト初期化する。
  • (2) : ブロードキャストコンストラクタ。単一の値valueを全要素にコピーする。
  • (3) : 変換コンストラクタ。要素数が等しい別のbasic_vecから、要素ごとに要素型を変換して構築する。
  • (4) : ジェネレータコンストラクタ。各要素を、そのインデックスを渡した関数オブジェクトgenの呼び出し結果で構築する。
  • (5) : 連続範囲rの先頭からsize()個の要素を読み込んで構築する。
  • (6) : マスク付き範囲読み込み。masktrueである要素だけをrから読み込み、falseの要素はvalue_type()で初期化する。
  • (7) : 複素数要素型のとき、実部の並びrealsと虚部の並びimagsから構築する。

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

  • (2) : std::remove_cvref_t<U>Fromとする。次のいずれかを満たすこと。
    • Ustd::convertible_to<value_type>を満たし、かつFromが算術型ではないこと
    • Fromが算術型であり、Fromからvalue_typeへの変換が値を保持する(value-preserving)こと
    • Fromが定数ラッパー(std::integral_constant等)であり、そのvalueが算術型で、value_typeで表現可能であること
  • (3) : UからTへの明示的な変換が可能であり、変換元の要素数がsize()と等しいこと
  • (4) : すべてのi0以上size()未満)について、gen(std::integral_constant<simd-size-type, i>())の型がstd::convertible_to<value_type>を満たすこと。その型が算術型である場合は、value_typeへの変換が値を保持すること
  • (5), (6) : Rstd::ranges::contiguous_rangeかつstd::ranges::sized_rangeであり、std::ranges::size(r)が定数式かつsize()と等しく、その要素型が「vectorizable type」であってTへ明示的に変換可能であること
  • (7) : basic_vecが複素数のデータ並列型(simd-complex)であること

適格要件

  • (5), (6) : テンプレートパラメータパックFlagsが変換フラグを含まない場合、rの要素型からvalue_typeへの変換が値を保持すること

事前条件

  • (5), (6) : Flagsが整列フラグを含む場合、std::ranges::data(r)が要求される境界に整列していること

効果

  • (1) : 各要素をデフォルト初期化する。
  • (2) : 引数をvalue_typeへ変換した値で各要素を初期化する。
  • (3) : すべてのiについて、第i要素をstatic_cast<T>(x[i])で初期化する。
  • (4) : すべてのiについて、第i要素をstatic_cast<value_type>(gen(std::integral_constant<simd-size-type, i>()))で初期化する。geniごとにちょうど1回、iの昇順で呼び出される。
  • (5), (6) : すべてのiについて、第i要素をmask[i] ? static_cast<T>(std::ranges::data(r)[i]) : T()で初期化する。(5)はmaskをすべてtrueとみなす。
  • (7) : すべてのiについて、第i要素をvalue_type(reals[i], imags[i])で初期化する。

explicitになる条件

  • (3) : 次のいずれかを満たすときexplicitとなる。
    • Uからvalue_typeへの変換が値を保持しない
    • Uvalue_typeがともに整数型であり、Uの整数変換順位がvalue_typeより高い
    • Uvalue_typeがともに浮動小数点型であり、Uの浮動小数点変換順位がvalue_typeより高い

例外

  • (1), (2), (3), (6), (7) : 投げない
  • (4), (5) : 「例外を投げない」とは規定されない

#include <simd>
#include <print>
#include <array>

namespace simd = std::simd;

template <class V>
void print(const char* name, const V& v)
{
  std::print("{}: ", name);
  for (int i = 0; i < v.size(); ++i) {
    std::print("{} ", v[i]);
  }
  std::println("");
}

int main()
{
  // (2) ブロードキャスト:全要素を同じ値に
  simd::vec<int, 4> b = 10;

  // (4) ジェネレータ:各要素をインデックスから生成
  simd::vec<int, 4> c([](int i) { return i + 1; });

  // (5) 連続範囲から読み込み
  std::array<int, 4> arr = {5, 6, 7, 8};
  simd::vec<int, 4> d{arr};

  // (3) 要素型を変換
  simd::vec<float, 4> e = simd::vec<int, 4>(c);

  ::print("b", b);
  ::print("c", c);
  ::print("d", d);
  ::print("e", e);
}

出力

b: 10 10 10 10 
c: 1 2 3 4 
d: 5 6 7 8 
e: 1 2 3 4 

バージョン

言語

  • C++26

処理系

関連項目

参照