在Ctor调用中,将std::initializer_list与括号内的参数分离

Separating std::initializer_list from parenthesis-enclosed arguments in Ctor invocation

本文关键字:分离 参数 list initializer 调用 Ctor std      更新时间:2023-10-16

我正在编写一个简单的库,其中易用性和稳定性是首要任务。例如,在我的Mat(Matrix)类中,当前构造函数签名是

Mat<ushort rows, ushort cols> A(std::initializer_list<double>);

在实践中是非常容易阅读和理解的:

Mat<2, 2> A{1, 2, 3, 4};

起初,这似乎是个好主意,因为我可以执行static_assert调用来检查是否尝试用0来实例化列或行模板参数的Matrix,但这显然意味着我不能动态实例化Matrix对象。

理想情况下,我想要一些类似的东西

Mat(uchar rows, uchar cols, std::initializer_list<double>)

以这样一种方式,我可以通过编写以下内容来实例化所述对象:

Mat A(2, 2) {1, 2, 3, 4};

然而,我不知道该怎么做,因为初始值设定项列表必须包含在括号参数列表中,而括号参数列表看起来并不那么干净:

Mat A(2, 2, {1, 2, 3, 4});

我不希望你尽量避免使用模板,我建议定义operator=(这不是你想要的,但可能很有用)

 Mat &operator=(std::initialize_list<int> c);

因此,您可以实例化您的类:

 Mat A(2,2);
 A={1,2,3,4};