匹配 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;

Demo