Namespaces
Variants

std::experimental:: where_expression

From cppreference.net
定義先ヘッダ <experimental/simd>
template < class M, class V >
class where_expression ;
(parallelism TS v2)

クラステンプレート where_expression は、算術型またはデータ並列型の与えられた左辺値の選択された要素の概念を抽象化します。選択された要素とは、マスク(型 M )の対応する要素が真である左辺値(型 V )の要素です。型 where_expression<M, V> のオブジェクトに適用される演算子は、選択された要素にのみ適用されます。その他のすべての要素は変更されません。

where 関数を使用して where_expression オブジェクトを構築します。

テンプレートパラメータ

M - マスク型
V - Mが適用される値型

( M , V ) の有効な組み合わせは以下の通りです:

  • ( simd_mask < T, Abi > , simd < T, Abi > )
  • ( simd_mask < T, Abi > , simd_mask < T, Abi > )
  • ( bool , T )

メンバー関数

選択された位置に代入する
(公開メンバ関数)
複合代入演算子
(公開メンバ関数)
インクリメントおよびデクリメント演算子
(公開メンバ関数)
アドレスから選択された位置にロードする
(公開メンバ関数)

#include <cstddef>
#include <experimental/simd>
#include <iostream>
namespace stdx = std::experimental;
void print(auto const& a)
{
    for (std::size_t i{}; i != std::size(a); ++i)
        std::cout << a[i] << ' ';
    std::cout << '\n';
}
template<class A>
stdx::simd<int, A> my_abs(stdx::simd<int, A> x)
{
    where(x < 0, x) = -x;
    return x;
}
int main()
{
    const stdx::native_simd<int> a([](int i) { return i - 2; });
    print(a);
    const auto b = my_abs(a);
    print(b);
}

出力例:

-2 -1 0 1 
2 1 0 1