目标是编写具有以下签名的类型特征:
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_type
的 test()
函数。如果它是 vector 类型之一,它将选择返回 true_type
的 test()
函数。
#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;
关于c++ - 匹配 clang/gcc 中的所有 GNU C SIMD vector 扩展类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69966501/