最終更新日時:
が更新

履歴 編集

function
<simd>

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

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

constexpr explicit basic_mask(same_as<value_type> auto x) noexcept; // (2) C++26

template<std::size_t UBytes, class UAbi>
constexpr explicit basic_mask(const basic_mask<UBytes, UAbi>& x) noexcept; // (3) C++26

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

template<same_as<bitset<size()>> T>
constexpr basic_mask(const T& b) noexcept;                     // (5) C++26

template<unsigned_integral T>
  requires (!same_as<T, value_type>)
constexpr explicit basic_mask(T val) noexcept;                 // (6) C++26

概要

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

  • (1) : デフォルトコンストラクタ。各要素は値初期化される
  • (2) : ブロードキャストコンストラクタ。すべての要素を単一の値xで初期化する
  • (3) : 変換コンストラクタ。要素数が等しい別のbasic_maskから各要素を変換して初期化する
  • (4) : ジェネレータコンストラクタ。各要素の値を、添字を引数とする関数オブジェクトgenの呼び出し結果で初期化する
  • (5) : std::bitsetの各ビットで対応する要素を初期化する
  • (6) : 符号なし整数値valの各ビットで対応する要素を初期化する

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

  • (3) : basic_mask<UBytes, UAbi>::size() == size()trueであること
  • (4) : すべてのi0 <= i < size())について、式gen(std::integral_constant<simd-size-type, i>())適格であり、その型がboolであること
  • (6) : Tvalue_typebool)と異なる符号なし整数型であること

効果

  • (1) : 各要素を値初期化する
  • (2) : 各要素をxで初期化する
  • (3) : すべてのi0 <= i < size())について、i番目の要素をx[i]で初期化する
  • (4) : すべてのi0 <= i < size())について、i番目の要素をgen(std::integral_constant<simd-size-type, i>())で初期化する
  • (5) : すべてのi0 <= i < size())について、i番目の要素をb[i]で初期化する
  • (6) : 先頭のM個の要素をvalの対応するビット値で初期化する。ここでMsize()と、valの型の値表現のビット数のうち小さいほうである。Msize()より小さい場合、残りの要素はfalseで初期化される

例外

  • (4) : genの呼び出しが例外を送出する場合を除いて、投げない

備考

  • (4) : genは各iにつき正確に1回、iの昇順で呼び出される

#include <simd>
#include <bitset>
#include <print>

namespace simd = std::simd;

int main()
{
  // (2) ブロードキャスト:すべての要素をtrueにする
  simd::mask<int, 4> allTrue{true};

  // (4) ジェネレータ:偶数番目の要素をtrueにする
  simd::mask<int, 4> gen = [](int i) { return i % 2 == 0; };

  // (5) bitsetから構築する(0番目のビットが先頭要素)
  simd::mask<int, 4> fromBitset{std::bitset<4>{"1010"}};

  // (6) 符号なし整数のビット列から構築する
  simd::mask<int, 4> fromBits{0b1010u};

  for (int i = 0; i < allTrue.size(); ++i)
    std::print("{} ", allTrue[i]);
  std::println("");

  for (int i = 0; i < gen.size(); ++i)
    std::print("{} ", gen[i]);
  std::println("");

  for (int i = 0; i < fromBits.size(); ++i)
    std::print("{} ", fromBits[i]);
  std::println("");
}

出力

true true true true 
true false true false 
false true false true 

バージョン

言語

  • C++26

処理系

参照