Так что я дал немного глупый ответ, который понравился людям.Но это намного проще, чем это:)
template <int D, typename T = float>
class v {
public:
template <typename... Args>
v(Args... args) : a{ T(args)... } {
static_assert(sizeof...(Args) == D, "wrong number of arguments");
}
private:
T a[D];
};
Вы можете использовать шаблоны с переменными параметрами и SFINAE, чтобы получить конструктор с нужным количеством параметров.
Конструкторы не имеютвозвращает значения, поэтому нам нужно использовать SFINAE для одного из параметров.И чтобы использовать шаблоны с переменным числом аргументов, нам нужно иметь пакет параметров в конце.
Это означает, что нам нужно использовать SFINAE для первого параметра.
Тогда это означает, что пакет параметров послепервый параметр должен иметь на один параметр меньше размеров.
Имея это в виду, мы можем написать:
template <int D, typename T>
class v {
public:
template <typename... Tail>
v(typename std::enable_if<sizeof...(Tail)+1 == D, T>::type head, Tail... tail)
: a{ head, T(tail)... } {}
private:
T a[D];
};
А теперь:
v<4, int> a(1,2,3,4); // ok!
v<4, int> b(1,2,3); // error! no such constructor