私はMatrixクラスを持っていると私は二つの方法で私のマトリックスオブジェクトを初期化したいとします2つのオーバーロードされた関数をネストされていないネストされたinitializer_listの引数で区別する方法?
Matrix a = {1,2,3} // for a row vector
と
Matrix b = {{1,2,3},{4,5,6},{7,8,9}} // for a matrix
その結果、私は
以下のように2つのコピーコンストラクタを実装しましたclass Matrix {
private:
size_t rows, cols;
double* mat;
public:
Matrix() {}
Matrix(initializer_list<double> row_vector) { ... }
Matrix(initializer_list< initializer_list<double> > matrix) { ... }
...
}
explicit
キーワードを追加する、または入れ子になったバージョンをMatrix(initializer_list< vector<double> > matrix)
に変更するなど、私のインターフェイスをどのように変更しても問題ありません。それは、常にこの2つのケースの間のあいまいさを引き起こします:
Matrix a = {1,2,3};n
Matrix b = {{1}, {2}, {3}};
私が直接/コピー初期化または暗黙の型変換のようなものとはかなり精通していませんよ。この問題の解決策はありますか?
入力に基づいてマトリクスサイズを調整しようとしていますか?例えば、 '{1,2,3}'が3x1ベクトルを生成し、 '{{1,2,3}、{4,5,6}、{7,8,9}}'が生成すると期待しますか? 3x3行列? –
@JonathanMee絶対に。 – pedim
@pedimだから、Visual Studio *を使用すると、3番目のコンストラクタを選択することになります。私はここでそれについての質問を開いた:http://stackoverflow.com/q/38795374/2642059 –