Angenommen, ich eine Matrix-Klasse haben, und ich möchte meine Matrix Objekte auf zwei Arten initialisieren:Wie zwei überladene Funktionen mit Argumenten von nicht verschachtelter und verschachtelter initializer_list unterscheiden?
Matrix a = {1,2,3} // for a row vector
und
Matrix b = {{1,2,3},{4,5,6},{7,8,9}} // for a matrix
Als Ergebnis implementiert ich zwei Kopierkonstruktoren wie unten
class Matrix {
private:
size_t rows, cols;
double* mat;
public:
Matrix() {}
Matrix(initializer_list<double> row_vector) { ... }
Matrix(initializer_list< initializer_list<double> > matrix) { ... }
...
}
Egal, wie ich meine Schnittstelle ändern, z. B. ein explicit
Schlüsselwort hinzufügen oder die verschachtelte Version zu Matrix(initializer_list< vector<double> > matrix)
ändern. Es wird immer dazu führen Unklarheiten zwischen diesen beiden Fällen:
Matrix a = {1,2,3};n
Matrix b = {{1}, {2}, {3}};
Ich bin nicht ganz mit dem Zeug wie direkt/Kopie der Initialisierung oder implizite Typumwandlung vertraut. Gibt es Lösungen für dieses Problem?
Versuchen Sie, Ihre Matrixgröße basierend auf der Eingabe anzupassen? Zum Beispiel erwarten Sie, dass '{1, 2, 3}' einen 3x1-Vektor ergibt und '{{1,2,3}, {4,5,6}, {7,8,9}}' ergibt eine 3x3-Matrix? –
@ JonathanMee absolut. – pedim
@pedim Es ist also etwas überraschend, wenn Sie Visual Studio * verwenden, wählt es * den dritten Konstruktor aus. Ich habe eine Frage dazu hier geöffnet: http://stackoverflow.com/q/38795374/2642059 –