# std::experimental::rebind_simd, std::experimental::resize_simd

< cpp‎ | experimental‎ | simd

定义于头文件 `<experimental/simd>` |  |
template< class T, class V > struct rebind_simd; | (1) | (并行 TS v2)
template< int N, class V > struct resize_simd; | (2) | (并行 TS v2)

创建拥有不同元素类型或大小的 `simd` 或 `simd_mask` 类型。新类型可能使用异于 `V::abi_type` 的 ABI 标签类型。

1) 更改元素类型为 `T` 并保持大小不变。
2) 更改大小为 `N` 并保持元素类型不变。

### 模板形参

T | - | 新元素类型； `bool` 以外的算术类型
N | - | 新的元素数
V | - | simd 或 simd_mask 类型

### 成员类型

名称 | 定义
`type` | 拥有不同元素类型 (1) 或大小 (2) 的 `simd` 或 `simd_mask` 类型

### 辅助类型

template< class T, class V > using rebind_simd_t = typename rebind_simd<T, V>::type; |  | (并行 TS v2)
template< int N, class V > using resize_simd_t = typename resize_simd<N, V>::type; |  | (并行 TS v2)

### 示例

    #include <experimental/simd>
    #include <iostream>

    namespace stdx = std::experimental;
    using floatv = stdx::native_simd<float>;

    // 内部使用双精度
    floatv dp(floatv x)
    {
        using doublev = stdx::rebind_simd_t<double, floatv>;
        return stdx::static_simd_cast<floatv>(stdx::simd_cast<doublev>(x) - 1.234);
    }

    template <class T>
    stdx::resize_simd_t<T::size() / 2, T> partial_reduction(T x)
    {
        auto [lo, hi] = stdx::split<stdx::resize_simd_t<T::size() / 2, T>>(x);
        return lo + hi;
    }

    int main()
    {
        floatv x([](auto i) { return 1.234f + std::numeric_limits<float>::epsilon() * i; });
        x = dp(x);
        const auto y = partial_reduction(x);
        for (unsigned i = 0; i < y.size(); ++i)
            std::cout << y[i] << ' ';
        std::cout << '\n';
    }

### 参阅

deduce deduce_t (并行 TS v2) | 获得给定的元素类型及元素数的 ABI 类型 (类模板)