std::array
ist ein bisschen seltsam. Es hat keinen benutzerdefinierten Konstruktor, also ähnelt es einer einfachen Struktur. So std::array<float,2>
ist ähnlich wie
struct two_floats {
float array[2];
};
Aus diesem Grund, wenn Sie einen initialisieren, würden Sie tun es logisch wie folgt aus:
two_floats x = {{1,2}};
std::array<float,2> y = {{1,2}};
Die äußeren Klammern für die Struktur selbst sind, und die inneren Verstrebungen sind für den Inhalt der Struktur.
kommt es vor, nur zu arbeiten, um einen Satz von Klammern zu bieten:
two_floats x = {1,2};
Aber dies ist durch eine spezielle Regel in C++, die Klammern weggelassen werden in bestimmten Fällen erlaubt. Ähnlich wie Sie ein zweidimensionales Array mit nur einem Satz von Klammern initialisieren können:
float x[2][2] = {1,2,3,4};
Und das ist, was geschieht, wenn Sie Ihren Bereich wie folgt initialisieren:
Range r({1, 2});
das entspricht
std::array<float,2> arg = {1,2}; // one set of braces omittted
Range r(arg);
Aber welche mehr explizit geschrieben werden würde, wie:
std::array<float,2> arg = {{1,2}};
Range r(arg);
Eine ähnliche Sache passiert beim Initialisieren der Box. Wenn wir ausdrücklich die Initialisierung schreiben es würde wie folgt aussehen:
std::array<float,2> box_arg1 = {{1,2}};
std::array<float,2> box_arg2 = {{3,4}};
std::array<float,2> box_arg3 = {{5,6}};
std::array<Range,3> box_args = {{box_arg1,box_arg2,box_arg3}};
Box b(box_args);
Also, wenn wir die initializers ersetzen, erhalten wir:
Box b({{{{1,2}},{{3,4}},{{5,6}}}});
und das funktioniert. Aber es ist ziemlich hässlich. Diese Initialisierung ist zu komplex, um zuzulassen, dass die zusätzlichen Klammern hier weggelassen werden. Dies ist das Problem, auf das Sie stoßen.
Eine Möglichkeit, um dies zu umgehen, um zusätzliche Konstruktoren zur Verfügung zu stellen, die die einzelnen Array-Elemente übernehmen.
class Range
{
public:
Range(float x,float y) : m_ends{x,y} { }
Range(std::array<float, 2> ends) : m_ends(ends) {}
private:
std::array<float, 2> m_ends;
};
class Box
{
public:
Box(Range x,Range y,Range z) : m_ranges{x,y,z} {}
Box(std::array<Range, 3> ranges) : m_ranges(ranges) {}
private:
std::array<Range, 3> m_ranges;
};
Und Sie können jetzt Ihre Box initialisieren wie Sie ursprünglich wollten:
Box b({{1,2}, {3,4}, {5,6}});
Dies funktioniert: 'Box b {{{{{1, 2}}, {{3,4}}, {{5,6}}}}} '. – user1887915