矩阵推导

nau*_*umi 5 c++ matrix template-argument-deduction c++17

我在寻找初始化矩阵的推导指南。

我试图在包使用包和sizeof...initializer_list<initializer_list<T>>为阵列的结构,但没有自定义类是作品?

所以,我正在寻找初始化

template <class T, size_t s1, size_t s2>
class matrix
{
T matr[s1][s2]; //maybe with custom array class, if this problem need this
public:
//constructor
};
//deductor
Run Code Online (Sandbox Code Playgroud)

喜欢

matrix m{{1, 2}, {1, 2}};
Run Code Online (Sandbox Code Playgroud)

要么

matrix m({1, 2}, {1, 2});
Run Code Online (Sandbox Code Playgroud)

max*_*x66 2

我找到了避免额外括号的方法。

这次还需要显式推导指南、SFINAE 和初始化matr成员的附加方法,但应该有效。

以下是一个完整的完整示例

#include <iostream>

template <typename T, std::size_t s1, std::size_t s2>
class matrix
 {
   private:
      T matr[s1][s2];

      void init_row (std::size_t i, T const (&arr)[s2])
       {
         for ( auto j = 0u ; j < s2 ; ++j )
            matr[i][j] = arr[j];
       }

   public:
      template <std::size_t ... Dims,
                std::enable_if_t<sizeof...(Dims) == s1, bool> = true,
                std::enable_if_t<((Dims == s2) && ...), bool> = true>
      matrix (T const (&...arrs)[Dims])
       { std::size_t i = -1; (init_row(++i, arrs), ...); }
 };

template <typename T, std::size_t Dim0, std::size_t ... Dims,
          std::enable_if_t<((Dim0 == Dims) && ...), bool> = true>
matrix (T const (&)[Dim0], T const (&...arrs)[Dims])
   -> matrix<T, 1u+sizeof...(Dims), Dim0>;


int main()
{
   matrix m{{1, 2}, {1, 2}, {1, 2}};

   static_assert( std::is_same_v<decltype(m), matrix<int, 3u, 2u>> );
}
Run Code Online (Sandbox Code Playgroud)