【发布时间】:2017-07-12 03:55:43
【问题描述】:
我想重载在arm_neon.h 中定义在ARM 系统上的uint32x4_t 的位移运算符。
struct uint32x4_t {
uint32_t val[4];
};
这应该通过调用 SIMD 函数来完成,该函数期望值发生变化并保持立即数:
uint32x4_t simdShift(uint32x4_t, constant_immediate);
shift.h
#ifndef SHIFT_H
#define SHIFT_H
namespace A {
namespace B {
/*uint32x4_t simdLoad(uint32_t*) {
...
}*/
template<int N>
uint32x4_t shiftRight(uint32x4_t vec) {
return vshrq_n_u32(vec,N);
}
}
}
uint32x4_t operator>>(uint32x4_t const & vec, const int v) {
return A::B::shiftRight<v>(vec);
}
#endif
main.cpp
#include "shift.h"
int main() {
uint32_t* data = new uint32_t[4];
data[0] = 1;
data[1] = 2;
data[2] = 3;
data[3] = 4;
uint32x4_t reg;// = simdLoad(data);
reg = reg>>3;
return 0;
}
此代码产生错误:
‘uint32x4_t operator>>(const uint32x4_t&, int)’必须有参数 类或枚举类型的 uint32x4_t 运算符>>(uint32x4_t const & vec, const int v) {
对于像uint32x4_t 这样的“本机”类型,是否有解决方法来重载operator>>?
编辑:我调整了建议的解决方法,但错误仍然保持不变:(
【问题讨论】:
-
你需要把算子纳入范围;
using namespace A::B;是一个简单的修复方法。顺便说一句,simdShift期望的constant_immediate必须是一个常量表达式;const int v参数不够用。 -
@ildjarn 但我不能将 constexpr 传递给函数,可以吗?
-
@Hymir :不像
int,不。但是您可以将其设为函数模板并传递std::integral_constant<int>的实例,这将起作用。您可以使用变量模板或 UDL 使构造integral_constant 实例清晰易读。 -
这是处理 constant_immediate 的绝佳提示!非常感谢!
标签: c++ arm operator-overloading c++14 simd