Я хочу перегрузить оператор битовой смены для uint32x4_t
, определенного в системах ARM, в arm_neon.h
.Перегрузка оператора битовой смены в C++
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;
}
Этот код produ КЕС ошибка:
‘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
?
Edit: Я адаптировал предложенные методы обхода, но ошибка по-прежнему остается той же :(
Вам необходимо привести оператора в объем; 'using namespace A :: B;' - простое исправление. В стороне, что 'constant_immediate', что' simdShift' ожидает, должно быть _constant expression_; параметр 'const int v' недостаточен. – ildjarn
@ildjarn Но я не могу передать constexpr в функцию, могу ли я? – Hymir
@Hymir: Не как 'int', no. Но вы можете сделать его шаблоном функции и вместо этого передать экземпляр 'std :: integral_constant', который будет работать. Вы можете использовать переменные шаблоны или UDL, чтобы сделать целостность экземпляров integ_constant разборчивыми. –
ildjarn