我正在尝试在gcc vector extensions上编写一个C ++ 11库,该clang也尝试兼容。所以我开始介绍矢量类型的一些特征:
template <typename T, unsigned N> struct vector_traits;
template <>
struct vector_traits<float, 3>
{
static constexpr auto size = 3;
using value_type = float;
using vector_type = value_type __attribute__((vector_size(16)));
};
template <>
struct vector_traits<float, 4>
{
static constexpr auto size = 4;
using value_type = float;
using vector_type = value_type __attribute__((vector_size(16)));
};
注意,2个特质专业化几乎是一样的。然后我想:
template <typename T, unsigned N>
using vector = typename vector_traits<T, N>::vector_type;
但无法推断出别名模板。所以,我无法推断出我是否用N
= 3或4实例化了向量。是否存在保留此信息的方法,而不引入包装类/结构?说
template <typename T, unsigned N>
struct vector<T, N>
{
typename vector_traits<T, N>::vector_type data_;
};