Вариативные шаблоны и устранение неоднозначности перегрузки - PullRequest
0 голосов
/ 25 июня 2018

При компиляции приведенный ниже код генерирует ошибку, отмеченную в строке 12;make_vec, похоже, не знает, вызывать ли конструктор A или B.

template<int N, typename T = double>
class vec {
    std::array<T, N> buf;
public:
    template <typename... Args, typename = std::enable_if_t<(sizeof...(Args) == N && N > 1)>>
    vec(Args&&... args) : buf({ std::forward<Args>(args)... }) {} // CONSTRUCTOR A
    explicit vec(std::array<T, N>&& arr) : buf(std::move(arr)) {} // CONSTRUCTOR B
};

template <typename... Args>
vec<sizeof...(Args), typename std::common_type<Args...>::type> make_vec(Args&&... args) {
    return vec<sizeof...(Args), typename std::common_type<Args...>::type>({ std::forward<Args>(args)... });
}     // THE LINE ABOVE GENERATES error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'vec<3,int>'
      //   note: No constructor could take the source type, or constructor overload resolution was ambiguous

int main() {
    auto x = make_vec(1, 2, 3);
    return 0;
}

Есть ли простой способ заставить make_vec вызвать конструктор A при сохранении сигнатур конструкторов A, B,и make_vec нетронутыми?

...