std::experimental::rebind_simd, std::experimental::resize_simd
来自cppreference.com
                    
                                        
                    < 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'; }
参阅
|    (并行 TS v2)  | 
   获得给定的元素类型及元素数的 ABI 类型   (类模板)  |