Namespaces
Variants

std::experimental:: simd_cast, std::experimental:: static_simd_cast

From cppreference.net
Определено в заголовке <experimental/simd>
template < class V, class T, class Abi >
/*see below*/ simd_cast ( const simd < T, Abi > & v ) noexcept ;
(1) (parallelism TS v2)
template < class V, class T, class Abi >
/*see below*/ static_simd_cast ( const simd < T, Abi > & v ) noexcept ;
(2) (parallelism TS v2)

Преобразует simd-объект в другой simd-объект. Если V является T, возвращает simd < T, Abi > ; иначе, если V является скалярным типом, возвращает simd < V, simd_abi :: fixed_size < simd < T, Abi > :: size ( ) >> . В противном случае V должен быть simd-типом, и функция возвращает V.

1) Эта функция не участвует в разрешении перегрузки, если только
  • каждое возможное значение входного элемента может быть представлено выходным элементом,
  • либо is_simd_v < V > ложно, либо V :: size ( ) равно simd < T, Abi > :: size ( ) .
2) Эта функция не участвует в разрешении перегрузки, если только is_simd_v < V > не равно false, или V :: size ( ) равно simd < T, Abi > :: size ( ) .

Содержание

Параметры

v - входной simd объект

Возвращаемое значение

Объект simd, у которого i-й элемент инициализирован значением static_cast < To > ( v [ i ] ) , где To — указанный тип выходного элемента.

Примечания

В спецификации TS отсутствуют simd_cast и static_simd_cast перегрузки для simd_mask . Реализация libstdc++ предоставляет недостающие перегрузки в пространстве имён std :: experimental :: __proposed . Если вы уже используете

namespace stdx = std::experimental;

ярлык, возможно, вам будет интересно использовать

namespace stdx {
  using namespace std::experimental;
  using namespace std::experimental::__proposed;
}

вместо этого. В качестве альтернативы, libstdc++ реализует __cvt ( ) функцию-член в simd_mask , которая позволяет неявное преобразование маски. Смотрите также: https://github.com/VcDevel/std-simd/issues/41

Пример