Краткий ответ
Вы должны std::initializer_list
.Это класс, функциональность которого в коротких словах заключается в том, чтобы масштабировать множество аргументов одинакового типа.Вы должны создать новый c-tor, который будет иметь аргумент std::initializer_list
.
Введение
В C ++ 11 у нас есть новый способ инициализации объекта:
int x(0); // old way, rarely used
int y = 0; // old way, most common
int z{ 0 }; // new way, bracing initialization
Готовая инициализация также известна как унификация инициализации.Для получения дополнительной информации по этой теме я рекомендую вам Effective Modern C ++ - точно пункт 7.
Бодрствующая инициализация имеет строгую типизацию с использованием std::initializer_list
(та же ситуация, что и с auto
. Это причина, почемукогда вы используете:
vector<vector<int> > vect{ { 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } };
Вы получили конструктор вектора, используя std :: initializer_list :
vector( std::initializer_list<T> init,
const Allocator& alloc = Allocator() );
Ответ
Теперь, если мы знаемкак работает инициализация скобок, мы знаем, что если у нас будет какой-либо c-tor с std::initializer_list
, то он будет вызван, если это возможно. Пример, как вы можете это сделать:
class ThreeNumbers
{
int x;
int y;
int z;
public:
ThreeNumbers(std::initializer_list<int> list)
{
std::initializer_list<int>::iterator it = list.begin();
x = *it++;
y = *it++;
z = *it;
}
};