ПРИМЕЧАНИЕ. Во всем этом нет необходимости, если только вы не добавили в класс функциональные возможности, чтобы он больше не был агрегатом. (Например, другие конструкторы, закрытые члены, базовый класс и т. д.). Непосредственный способ исправить код в вопросе — просто удалить конструктор. Итак, давайте предположим, что в этом есть что-то еще.
Я видел, как некоторые люди пытались делать что-то подобное. Это кажется уродливым, иметь дело с семантикой преобразования и пытаться искусственно воссоздать функциональность обычного вызова функции.
Вот стратегия создания класса массива, у которого в первую очередь просто есть правильный конструктор.
Псевдонимы шаблонов добавили бы вишенки на торт, скрыв ::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 );
}
person
Potatoswatter
schedule
16.09.2010
boost::numeric_cast
и специально разрешите сужение конверсий. Так или иначе, вы сужаете эти аргументы. - person Potatoswatter   schedule 16.09.2010