*/
template<typename _Tp, typename = typename std::enable_if<std::is_arithmetic<_Tp>::value>::type>
explicit Mat(const std::initializer_list<_Tp> list);
+
+ /** @overload
+ */
+ template<typename _Tp> explicit Mat(const std::initializer_list<int> sizes, const std::initializer_list<_Tp> list);
#endif
#ifdef CV_CXX_STD_ARRAY
#ifdef CV_CXX11
Mat_(std::initializer_list<_Tp> values);
+ explicit Mat_(const std::initializer_list<int> sizes, const std::initializer_list<_Tp> values);
#endif
#ifdef CV_CXX_STD_ARRAY
return;
Mat((int)list.size(), 1, traits::Type<_Tp>::value, (uchar*)list.begin()).copyTo(*this);
}
+
+template<typename _Tp> inline
+Mat::Mat(const std::initializer_list<int> sizes, const std::initializer_list<_Tp> list)
+ : Mat()
+{
+ size_t size_total = 1;
+ int *sz = (int*)sizes.begin();
+ for(auto s : sizes)
+ size_total *= s;
+ CV_Assert(list.size() != 0 || size_total == list.size());
+ Mat((int)sizes.size(), sz, traits::Type<_Tp>::value, (uchar*)list.begin()).copyTo(*this);
+}
#endif
#ifdef CV_CXX_STD_ARRAY
Mat_<_Tp>::Mat_(std::initializer_list<_Tp> list)
: Mat(list)
{}
+
+template<typename _Tp> inline
+Mat_<_Tp>::Mat_(const std::initializer_list<int> sizes, std::initializer_list<_Tp> list)
+ : Mat(sizes, list)
+{}
#endif
#ifdef CV_CXX_STD_ARRAY
{
Mat A({1.f, 2.f, 3.f});
Mat_<float> B(3, 1); B << 1, 2, 3;
+ Mat_<float> C({3}, {1,2,3});
ASSERT_EQ(A.type(), CV_32F);
ASSERT_DOUBLE_EQ(cvtest::norm(A, B, NORM_INF), 0.);
+ ASSERT_DOUBLE_EQ(cvtest::norm(A, C, NORM_INF), 0.);
+ ASSERT_DOUBLE_EQ(cvtest::norm(B, C, NORM_INF), 0.);
}
TEST(Mat_, from_initializer_list)
{
Mat_<float> A = {1, 2, 3};
Mat_<float> B(3, 1); B << 1, 2, 3;
+ Mat_<float> C({3}, {1,2,3});
ASSERT_DOUBLE_EQ(cvtest::norm(A, B, NORM_INF), 0.);
+ ASSERT_DOUBLE_EQ(cvtest::norm(A, C, NORM_INF), 0.);
+ ASSERT_DOUBLE_EQ(cvtest::norm(B, C, NORM_INF), 0.);
}