Инициализация частного члена std :: array через конструктор

У меня есть, например, следующий код:

#include <iostream>
#include <array>

class Base {
public:
Base() : mA(std::array<int,2>()) {}
Base(std::array<int,2> arr) : mA(arr) {}
Base(/* what to write here ??? */);
private:
std::array<int,2> mA;
};

int main()
{
std::array<int,2> a = {423, 12}; // Works fine
Base b(a); // Works fine
Base c({10, 20}); // This is what I need.

return 0;
}

Как мне определить конструктор, чтобы разрешить инициализацию, как показано в 3-й строке внутри «main» выше? В общем, мне нужна конфигурируемая (по длине во время компиляции / выполнения) структура, которая позволит инициализировать списком чисел, например {1, 2, 3} или (1, 2, 3) или чем-то подобным, без необходимости побочное копирование. Я выбрал std :: array для простоты, но, боюсь, он может не работать с этим типом инициализации. Какой контейнер вы бы порекомендовали?

Спасибо,
Костя

0

Решение

Вы можете добавить конструктор, который принимает std::initializer_list<int> и скопируйте содержимое в массив:

#include <initializer_list>
#include <algorithm>

....

Base(std::initializer_list<int> a) {
// check size first
std::copy(a.begin(), a.end(), mA.begin()); }
}

Замечания: Если вы хотели бы хранить несколько элементов, определенных во время выполнения, тогда вы должны использовать std::vector<int> Это конструктор из initializer_list<int> поэтому код проще:

class Foo {
public:
Foo() {}
Foo(const std::vector<int>& arr) : mA(arr) {}
Foo(std::initializer_list<int> a) : mA(a) {}
private:
std::vector<int> mA;
};

Вы можете инициализировать это так:

Foo f1({1,2,3,4,5});

или же

Foo f2{1,2,3,4,5};
5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector