由整数常量

时间:2017-09-07 16:46:04

标签: c++ templates c++17 constexpr non-type

因为_mm_extract_epi64()将一个必须在编译时知道的常量作为参数,我试图实现一个由整数常量模板化的构造函数:

  union Packed64 {
    double _f64;
    float _f32[2];
    uint64_t _u64;
    int64_t _i64;
    uint32_t _u32[2];
    int32_t _i32[2];
    uint16_t _u16[4];
    int16_t _i16[4];
    uint8_t _u8[8];
    int8_t _i8[8];

    Packed64() { }

    template<uint8_t taAt> explicit Packed64(const __m128i& vect, const uint8_t taAt)
      : _i64(_mm_extract_epi64(vect, taAt)) { }
    explicit Packed64(const uint64_t valU64) : _u64(valU64) { }
  };

然而,当我尝试使用像

这样的构造函数时使用这种语法
const __m128i a = /* calculated here */;
Packed64 p64(a, 0);

我在上面的最后一行收到编译错误:

error C2661: 'Packed64::Packed64': no overloaded function takes 2 arguments

你能帮助使用正确的语法吗?

1 个答案:

答案 0 :(得分:0)

https://stackoverflow.com/a/16944262/453271中的非类型模板参数相同:

template<int I>
struct id
{};

struct A {
  template<int I>
  A(id<I>)
  {}
};

A a{id<0>{}};