Ich möchte den Bitshift-Operator für eine uint32x4_t
über ARM-Systeme in arm_neon.h
definiert überladen.Überladen Bitshift-Operator in C++
struct uint32x4_t {
uint32_t val[4];
};
Dies sollte mit einem Aufruf eine SIMD-Funktion erfolgen, die der Wert zu verschieben und einem konstanten sofort erwartet:
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;
}
Dieser Code produ ces der Fehler:
‘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) {
Gibt es eine Abhilfe wie uint32x4_t
operator>>
für "native" Typen zu überlasten?
Edit: Ich die vorgeschlagenen Abhilfen angepasst, aber der Fehler bleibt immer noch die gleiche :(
Sie müssen den Bediener in den Geltungsbereich bringen; 'mit Namespace A :: B;' ist eine einfache Lösung. Nebenbei bemerkt, muss das 'constant_immediate', das' simdShift' erwartet, ein _konstanter Ausdruck_ sein; ein 'const int v' Parameter ist nicht ausreichend. – ildjarn
@ildjarn Aber ich kann einen conetexpr in eine Funktion nicht übergeben kann ich? – Hymir
@Hymir: Nicht als ein 'int', nein. Aber Sie können es zu einer Funktionsvorlage machen und statt dessen eine Instanz von 'std :: integral_constant' übergeben, was funktionieren wird. Sie können variable Vorlagen oder eine UDL verwenden, um das Konstruieren von integral_constant-Instanzen lesbar zu machen. –
ildjarn