匹配 clang/gcc 中的所有 GNU C SIMD 矢量扩展类型
Match all GNU C SIMD vector extension types in clang/gcc
objective是写一个类型特征,签名如下:
template<typename T>
struct is_vector : std::true_type / std::false_type
这样您就可以在 SFINAE 签名中使用 is_vector<T>::value
。如何正确检测 GCC/clang 中的类型是否为 __attribute__((__vector_size(<some_vector_width>)) <some_built-in_type>
?
我浏览了 the LLVM documentation but couldn't see any built-ins to detect this. The GNU C documentation 同样只将它记录为 C 扩展,没有提到 C++。
备用计划是为每个排列专门化模板,但这听起来确实不太好。
您可以创建一个类型特征来检查它是否是这些向量类型之一。找到一种方法来做到这一点有点棘手,但使用一个对向量进行操作的内置函数似乎可行。
在这个 gcc 示例中,我使用 __builtin_convertvector
尝试将向量类型转换为相同的向量类型。如果不是向量类型,SFINAE 将 select test()
函数 returns false_type
。如果它是向量类型之一,它将 select test()
函数 returns true_type
.
#include <type_traits>
template<class T>
struct is_vector {
static std::false_type test(...);
template<class B>
static auto test(B) ->
decltype(__builtin_convertvector(std::declval<B>(), B), std::true_type{});
static constexpr bool value = decltype(test(std::declval<T>()))::value;
};
template<class T>
static constexpr bool is_vector_v = is_vector<T>::value;
objective是写一个类型特征,签名如下:
template<typename T>
struct is_vector : std::true_type / std::false_type
这样您就可以在 SFINAE 签名中使用 is_vector<T>::value
。如何正确检测 GCC/clang 中的类型是否为 __attribute__((__vector_size(<some_vector_width>)) <some_built-in_type>
?
我浏览了 the LLVM documentation but couldn't see any built-ins to detect this. The GNU C documentation 同样只将它记录为 C 扩展,没有提到 C++。
备用计划是为每个排列专门化模板,但这听起来确实不太好。
您可以创建一个类型特征来检查它是否是这些向量类型之一。找到一种方法来做到这一点有点棘手,但使用一个对向量进行操作的内置函数似乎可行。
在这个 gcc 示例中,我使用 __builtin_convertvector
尝试将向量类型转换为相同的向量类型。如果不是向量类型,SFINAE 将 select test()
函数 returns false_type
。如果它是向量类型之一,它将 select test()
函数 returns true_type
.
#include <type_traits>
template<class T>
struct is_vector {
static std::false_type test(...);
template<class B>
static auto test(B) ->
decltype(__builtin_convertvector(std::declval<B>(), B), std::true_type{});
static constexpr bool value = decltype(test(std::declval<T>()))::value;
};
template<class T>
static constexpr bool is_vector_v = is_vector<T>::value;