素敵な基本クラスMatrixを開発しようとしています。コンテナはdata_type(テンプレート引数)へのポインタです。行列のエレガントなコンストラクタと中かっこ
は、私がこのように私のマトリックスを構築できる方法を見つけ出すのが好きI'would:
Matrix<type> mat = { {1,2,3}, {4,5,6} };
今パラメータの任意の数は、このコンストラクタを使用している与えられて構築する唯一の方法:
を//--- construct by list of arguments
template<typename data_type>
template <typename ... Ts>
constexpr Matrix<data_type>::Matrix(std::size_t row ,
std::size_t col ,
Ts&&... args ) noexcept : row{row}, columns{col},
data{ new data_type[row*col] }
{
assert(sizeof...(args) == row*columns);
std::initializer_list<data_type> il ({ std::forward<Ts>(args)... });
std::copy(il.begin(), il.end(), data);
}
が、私は、ユーザー側のコードでは、このがらくたの表現を使用する必要があり、これを使用する:
Matrix<double> m3(3,2,1.12,2.434,3.546546,4.657,5.675675,6.542354);
あなたの貴重なご支援に感謝します!
私はこの解決策を見つけました。しかし、もっと良い方法があるかどうかは分かりません....ここでは完全にコードです(私はこのコンストラクタを使って行列クラスを作成しました試してください):
# include <iostream>
# include <initializer_list>
# include <iterator>
using namespace std;
template <typename data_type>
class Matrix {
public:
constexpr Matrix(std::initializer_list<std::initializer_list<data_type>> rows) {
size_t row = rows.size() ;
cout << "Here" << endl;
auto il = *(rows.begin());
size_t col = il.size();
cout << row << ' ' << col << endl;
size_t i=0;
size_t n = row * col;
cout << n << endl;;
data = new data_type[ n ];
i=0;
for(auto& row : rows)
for(auto & r : row){
data[i] = r ;
i++;
}
for (i=0; i < n ; i++)
cout << data[i] << endl;
}
private:
data_type* data;
};
int main(){
Matrix<int> mat = {{1,2,3}, {4,5,6}};
return 0;
}
ネストされたイニシャライザリストはどうですか?何かが好きです:テンプレート行列(std :: initializer_list >行) –
これはプログラミングの練習問題ですか?そうでない場合は、[Eigen](http://eigen.tuxfamily.org)のような非常に最適化された線形代数ライブラリの多くを使用することはできません。 – Darhuuk
エクササイズではありません...私は特別な操作で私のマトリックスクラスを開発したいと思っています:) –