Was ist die richtige Methode zum initialisieren eines Mitglieds-array mit einer Initialisierer-Liste?

Ich habe eine struct hält, dass ein array, und ich möchte, um eine Initialisierungsliste um die struct-Konstruktor weitergeleitet werden, auf dem array. Um zu veranschaulichen, habe ich versucht:

#include <initializer_list>

struct Vector
{
    float v[3];

    Vector(std::initializer_list<float> values) : v{values} {}
};

int main()
{
    Vector v = {1, 2, 3};
}

Die zu dem Fehler geführt haben:

error: cannot convert ‘std::initializer_list<float>’ to ‘float’ in initialization

Ich habe versucht, mit Klammern, statt der geschweiften Klammern für v aber das gab die Fehlermeldung:

error: incompatible types in assignment of ‘std::initializer_list<float>’ to ‘float [3]’

Meine Haupt-motivation für den Versuch, dies zu tun ist zu vermeiden, wird die folgende Warnung, dass das Geräusch erzeugt:

template <int N>
struct Vector
{
    float v[N];
};

template <>
struct Vector<2>
{
    float x, y;
};

int main()
{
    Vector<2> v2 = {1.0f, 2.0f};         //Yay, works
    Vector<3> v3 = {1.0f, 2.0f, 3.0f};   //Results in warning in clang++
    Vector<3> u3 = {{1.0f, 2.0f, 3.0f}}; //Must use two braces to avoid warning
    //If I could make Vector<N> take an initializer list in its constructor, I
    //could forward that on to the member array and avoid using the double braces
}

warning: suggest braces around initialization of subobject

Also meine Frage ist: Wie kann ich die initialisieren Mitglied array mit einer Initialisierer-Liste? (also Wie kann ich den ersten code arbeiten? Oder ist es nicht möglich?

  • Für ein Aggregat, das Sie benötigen würde nicht einmal ein Tor. Hinweis: die Größe eines initializer_list ist variabel. Es gibt auch einen Unterschied zwischen Initialisierung mit einem initializer-list und Liste-Initialisierung (das ist ein sprachkonstrukt und kann dazu führen, ruft ein Tor mit einer Initialisierer-Liste).
  • Sie können das nicht wirklich tun, aber könnten Sie verwenden ein std::array statt?
  • Er könnte std::array, aber ich lese dies als eine Frage der Sprache, nicht der standard-Bibliothek. Und, mit allem Respekt wem auch immer, sagen, jemand zu gehen, Lesen Sie die standard-Bibliothek zu erzählen ist wie ein Kleinkind, Englisch zu lernen durch die Lektüre von Shakespeare. Also std::array ist das nicht ein sehr gute Antwort.
InformationsquelleAutor Cornstalks | 2013-05-02
Schreibe einen Kommentar