ПРИМЕЧАНИЕ: Все это не нужно, если вы не добавили функциональность класса, так что это уже не совокупность. (Например, другие конструкторы, частные члены, базовый класс и т. Д.). Прямой способ исправить код в вопросе - это просто удалить конструктор. Итак, давайте предположим, что есть что-то еще.
Я видел, как некоторые люди пытались это сделать. Кажется уродливым, имея дело с семантикой конверсии и попыткой искусственного воссоздания функциональности обычного вызова функции.
Вот стратегия создания класса массива, который в первую очередь имеет правый конструктор.
Наложение шаблона наложило глазурь на торт, спрятав ::type
уродство, но оно еще не в GCC.
template< typename ... NT >
struct var_ctor_array {
enum { size_e = 0 }; // only used for zero size case
};
template< typename T, typename ... NT >
struct var_ctor_array< T, NT ... > {
enum { size_e = 1 + sizeof...(NT) };
T st[ size_e ];
var_ctor_array(T elem0, NT ... elemN)
: st { elem0, elemN ... } {}
};
template< typename T, size_t N, typename ... NT >
struct gen_var_ctor_array {
typedef typename gen_var_ctor_array< T, N-1, T, NT ... >::type type;
};
template< typename T, typename ... NT >
struct gen_var_ctor_array< T, 0, NT ... > {
typedef var_ctor_array< NT ... > type;
};
int main() { // usage
gen_var_ctor_array< char, 5 >::type five(1, 2, 3, 4, 5);
}
Почему это проблема бросить значения? Если вы хотите быть осторожным в том, что происходит, вы используете 'boost :: numeric_cast' и специально разрешаете сужение конверсий. Так или иначе, вы сужаете эти аргументы. – Potatoswatter
Если вы не предоставляете конструктор, вы сможете использовать инициализацию скобок для агрегатов. – sellibitze