C++ 使用模板为基本类型创建别名?
C++ create aliases for primitive types using templates?
我正在尝试编写一些东西来包装 simd 内在函数,我认为做一些类似
的事情会很好
using vec<float, 4> = __m128;
以便我可以在以后编写的一些代码中使用模板。这与问题并不相关,但 __m128 是一种代表 4 个浮点数的类型。这不起作用,g++ 说 expected nested-name-specifier before 'vec'
。我知道我可以只写 类 来包装它们,或者我可以这样做:
template <typename T, int N> struct vec;
template<> struct vec<float, 4>
{
typedef __m128 type;
};
然后就可以用vec<float,4>::type
了,不过第一种方式方便多了。我认为使用 C++ template typedef 之类的东西可能是可行的,但我不确定,而且我不知道语法。有什么方法可以使第一个语句起作用或做类似的事情吗?
不行,第一个不行。鉴于当前的规则,这没有意义(你不能像那样劫持模板的语法)。
然而你的第二个解决方案是完美的!您只需要稍微调整一下:
namespace impl {
template <typename T, int N> struct vec;
template<> struct vec<float, 4>
{
typedef __m128 type;
};
}
template<typename T, int N>
using vec = typename impl::vec<T, N>::type;
现在 vec
是引用相应结构的 type
的实际模板。
我正在尝试编写一些东西来包装 simd 内在函数,我认为做一些类似
的事情会很好using vec<float, 4> = __m128;
以便我可以在以后编写的一些代码中使用模板。这与问题并不相关,但 __m128 是一种代表 4 个浮点数的类型。这不起作用,g++ 说 expected nested-name-specifier before 'vec'
。我知道我可以只写 类 来包装它们,或者我可以这样做:
template <typename T, int N> struct vec;
template<> struct vec<float, 4>
{
typedef __m128 type;
};
然后就可以用vec<float,4>::type
了,不过第一种方式方便多了。我认为使用 C++ template typedef 之类的东西可能是可行的,但我不确定,而且我不知道语法。有什么方法可以使第一个语句起作用或做类似的事情吗?
不行,第一个不行。鉴于当前的规则,这没有意义(你不能像那样劫持模板的语法)。
然而你的第二个解决方案是完美的!您只需要稍微调整一下:
namespace impl {
template <typename T, int N> struct vec;
template<> struct vec<float, 4>
{
typedef __m128 type;
};
}
template<typename T, int N>
using vec = typename impl::vec<T, N>::type;
现在 vec
是引用相应结构的 type
的实际模板。