【问题标题】:Using brace-init for a non-trivial multi-variable class将大括号初始化用于非平凡的多变量类
【发布时间】:2018-11-17 01:01:04
【问题描述】:

我正在尝试使某个模板类大括号可初始化,例如

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)) {}

但这对我不起作用。救命!

【问题讨论】:

  • Matrix(std::initializer_list&lt;T&gt; list, std::size_t m, std::size_t n);

标签: c++ constructor initialization initializer-list curly-braces


【解决方案1】:

为了将 initializer_list 转换为向量,您可以复制所有元素。 STL 使用开始/结束迭代器使这非常好。这是矢量的所有可能的constructors

    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)
    {

    }

【讨论】:

  • 哇,你真是个天才。从来没有想过你可以在列表之后有额外的参数。我不知道为什么;这很有意义。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 2016-12-11
  • 1970-01-01
  • 2015-10-21
  • 2013-08-23
  • 1970-01-01
相关资源
最近更新 更多