Использование brace-init для нетривиального многопеременного класса - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь сделать определенный шаблонный класс инициализируемым скобками, например,

template<typename T>
class A {
    private:
        std::vector<T> _data;
        std::size_t _m;
        std::size_t _n;

    public:
        Matrix(std::size_t m, std::size_t n, const T &fill); // regular (non-trivial) constructor
        Matrix(std::initializer_list<T> list);
};

Однако у меня возникают проблемы с реализацией.Я хочу иметь возможность:

A<int> a = {{1, 2, 3, 4}, 2, 2};
// or something similar...e.g. C++11 style brace-init
A<int> a {{1, 2, 3, 4}, 2, 2};

Я пробовал:

template<typename T>
Matrix<T>::Matrix(std::initializer_list<T> list)
    : _data(*list.begin()),
      _m(*(list.begin() + 1)),
      _n(*(list.begin() + 2)) {}

Но это не работает для меня.Помогите!

1 Ответ

0 голосов
/ 17 ноября 2018

Для преобразования из initializer_list в вектор вы можете скопировать все элементы. STL делает это довольно хорошо с начала / конца итераторов. Вот все возможные конструкторы для вектора

    Matrix(std::initializer_list<T> list, std::size_t m, std::size_t n)
    : _data(list.begin(), list.end()) // This is what might help
    , _m(m)
    ,_n(n)
    {

    }
...