C++ 使用模板为原始类型创建别名?

标签 c++ c++11 templates typedef

我正在尝试写一些东西来包装 simd 内在函数,我认为做类似的事情会很好

using vec<float, 4> = __m128;

这样我就可以在以后编写的一些代码中使用模板。这与问题无关,但 __m128 是代表 4 个 float 的类型。这不起作用,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

关于C++ 使用模板为原始类型创建别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51013033/

相关文章:

c++ - Windows API,__declspec(thread) vs CreateThread?

c++ - 库在静态和动态链接中的顺序

java - Java 中是否有像 C++ 那样的成员初始化列表语法?

c++ - 构造函数中的 std::initializer_list 转换

c++ - 来自给定输入的理性算术

c++ - 使用类定义之外的默认参数定义的默认构造函数,为什么会这样?涉及的模板会发生什么?

c++ - 如何在c++中高效地在 map 中创建 map

c++ - C++调用回调后删除一个对象

C++11 简化了调用同一模板函数的不同特化的模板函数的语法

c++ - SIMD 指令缺少 OpenMP if 子句