Конструктор на основе целочисленной константы

Поскольку _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

Не могли бы вы помочь с правильным синтаксисом?


person Serge Rogatch    schedule 07.09.2017    source источник
comment
@ Rakete1111, мой вопрос конкретно о параметрах, не относящихся к типу. Я также видел этот вопрос: stackoverflow.com/questions/3960849/c-template- конструктор. Там они предлагают решения для параметров типа шаблона. Итак, я пытаюсь выяснить, можно ли реализовать что-то подобное для параметров, не являющихся типами, но пока не могу найти правильный синтаксис ...   -  person Serge Rogatch    schedule 07.09.2017
comment
@ Rakete1111, теперь я вижу способ обхода Gruffalo. Но не может ли C ++ вывести аргумент шаблона, не являющийся типом, если он передается в качестве параметра? Я имею в виду, нет ли какого-то исправления для кода, который я опубликовал, вместо того, чтобы полностью переработать его для другого обходного пути?   -  person Serge Rogatch    schedule 07.09.2017
comment
На самом деле нет, может, это все-таки не дубликат :) Спасибо   -  person Rakete1111    schedule 07.09.2017
comment
Этот stackoverflow.com/questions/8837113/ предполагает, что нет возможности исправить мой код, поэтому, возможно, вопрос действительно дублируется.   -  person Serge Rogatch    schedule 07.09.2017
comment
он дублируется, потому что в принятом ответе говорится, что нет способа исправить ваш код, только обходной путь   -  person Andriy Tylychko    schedule 08.09.2017


Ответы (1)


То же, что и в https://stackoverflow.com/a/16944262/453271, только с параметром шаблона без типа:

template<int I>
struct id
{};

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

A a{id<0>{}};
person Andriy Tylychko    schedule 07.09.2017