在 C++ 中重载位移运算符

Hym*_*mir 4 c++ arm operator-overloading simd c++14

我想为uint32x4_tarm_neon.h.

struct uint32x4_t {
   uint32_t val[4];
};
Run Code Online (Sandbox Code Playgroud)

这应该通过调用 SIMD 函数来完成,该函数期望值移位和常量立即数:

uint32x4_t simdShift(uint32x4_t, constant_immediate);
Run Code Online (Sandbox Code Playgroud)

移位.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
Run Code Online (Sandbox Code Playgroud)

主程序

#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;
}
Run Code Online (Sandbox Code Playgroud)

此代码产生错误:

'uint32x4_t operator>>(const uint32x4_t&, int)' 必须有一个类或枚举类型的参数 uint32x4_t operator>>(uint32x4_t const & vec, const int v) {

是否有解决方法可以重载operator>>“本机”类型,例如uint32x4_t

编辑:我调整了建议的解决方法,但错误仍然相同:(

ild*_*arn 5

ErmIg 答案的增量改进:

template<int N>
constexpr std::integral_constant<int, N> i_{};

template<int N>
uint32x4_t operator >>(uint32x4_t value, std::integral_constant<int, N>) noexcept {
    return _mm_slli_si128(value, N);
}

int main() {
    std::uint32_t data[4] = {1, 2, 3, 4};
    uint32x4_t reg;// = simdLoad(&data);
    reg = reg >> i_<3>;
}
Run Code Online (Sandbox Code Playgroud)

Nb 我已经放入operator>>了全局命名空间;如果你想把它放在一个不同的命名空间中,你需要在使用它之前将操作符引入作用域。