c++ - 匹配 clang/gcc 中的所有 GNU C SIMD vector 扩展类型

标签 c++ gcc clang simd sfinae

目标是编写具有以下签名的类型特征:

template<typename T>
struct is_vector : std::true_type / std::false_type

这样你就可以使用 is_vector<T>::value在 SFINAE 签名中。如何正确检测类型是否为 __attribute__((__vector_size(<some_vector_width>)) <some_built-in_type>在 GCC/clang 中?

我浏览了 the LLVM documentation但看不到任何内置插件来检测到这一点。 GNU C documentation同样只将其记录为 C 扩展,而没有提及 C++。

备份计划是为每个排列专门化模板,但这听起来确实不太好。

最佳答案

您可以创建一个类型特征来检查它是否是这些 vector 类型之一。找到一种方法来做到这一点有点棘手,但使用一个对 vector 进行操作的内置函数似乎可行。

在这个 gcc 示例中,我使用 __builtin_convertvector 尝试将 vector 类型转换为相同的 vector 类型。如果不是 vector 类型,SFINAE 将选择返回 false_typetest() 函数。如果它是 vector 类型之一,它将选择返回 true_typetest() 函数。

#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

关于c++ - 匹配 clang/gcc 中的所有 GNU C SIMD vector 扩展类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69966501/

相关文章:

gcc - 汇编器错误: expression too complex

c++ - __debugbreak 的可移植等效项

c++ - 递归算法的复杂性

c++ - 如何正确销毁窗口?

c++ - 减少 Boost Python 编译时间

c++ - 跨多个命名空间的 clang 错误 "explicit instantiation does not refer to a function template"

clang 中的代码覆盖率

c++ - 使用 boost asio 编译项目时出错

gcc - 如何防止 Qt Creator 为同一个库生成多个 .so 文件?

c - 如何知道任何库函数(中止)调用是否在源代码中多次使用?