にARMシステムで定義されているuint32x4_t
のビットシフト演算子をオーバーロードしたいとします。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;
}
このコードは、 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) {
uint32x4_t
のような「ネイティブ」タイプのためoperator>>
をオーバーロードするための回避策はありますか?
編集:私は提案の回避策を適応しますが、エラーがまだ同じ:(
オペレータを有効範囲にする必要があります。 'using namespace A :: B;'は簡単に修正できます。とにかく、 'simdShift'が期待する' constant_immediate'は_式でなければなりません。 'const int v'パラメータでは不十分です。 – ildjarn
@ildjarnしかし、関数にconstexprを渡すことはできませんか? – Hymir
@Hymir: 'int'ではなく、いいえ。しかし、それを関数テンプレートにして、代わりに 'std :: integral_constant'のインスタンスを渡すことができます。変数テンプレートまたはUDLを使用して、constructorのintegral_constantインスタンスを読みやすくすることができます。 –
ildjarn