我想重載在arm_neon.h
的ARM系統上定義的uint32x4_t
的bitshift運算符。在C++中重載bitshift運算符
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中:
struct uint32x4_t {
uint32_t val[4];
};
這應該與一個SIMD函數的調用,它期望的價值轉移和恆定立即完成
#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;
}
This code produ CES錯誤:
‘uint32x4_t operator>>(const uint32x4_t&, int)’ must have an argument of class or enumerated type uint32x4_t operator>>(uint32x4_t const & vec, const int v) {
有一種解決方法重載operator>>
爲「本地」類型,如uint32x4_t
?
編輯:我適應了建議的解決方法,但錯誤依然保持不變:(
您需要將操作員納入範圍; '使用名稱空間A :: B;'是一個簡單的修復。另外,'simdShift'所期望的'constant_immediate'必須是_constant表達式_;一個'const int v'參數是不夠的。 – ildjarn
@ildjarn但我不能將constexpr傳遞給一個函數,我可以嗎? – Hymir
@Hymir:不是'int',沒有。但是,您可以將其設置爲函數模板,並傳遞'std :: integral_constant'的實例,它將起作用。您可以使用變量模板或UDL來構造清晰的整型實例。 –
ildjarn