class array global definieren
-
Tut mir , aber ich blicks nicht. SeppJ übernimmt das jetzt :D, und ich geh schlafen.

-
Wenn du eine eigene Klasse schreibst kannst du ohne Probleme den operator[] überladen. Aber einen operator[][], wie du ihn haben möchtest, gibt es nicht. (Vllt kann da einer von den Gurus irgendwie tricksen, aber das hilft dir nicht weiter, da du beim kleinsten Fehler wahrscheinlich schon nicht wüsstest, was wie wo nicht geht oder kaputt ist.)
Zumal du auch eh eher einen C-lastigen Ansatz hast.
Mach es wie out vorgeschlagen hat und überlade den operator(), dann schreibst du halt statt: map[x][y] nur map(x, y)
-
Hallo,
2D Indexoperatoren kann man über eine Proxyklasse realisieren. Man gibt dann einfach im Indexoperator diese Proxyklasse zurück die wiederum selbst einen überladenen Indexoperatur hat.
Erklärung z. Bsp. hier
http://www.c-plusplus.net/forum/232303-full
-
Schon mal was von einem Proxy-Objekt gehört?
#include <cstddef> class Map { private: bool data[79*23]; template<typename ValT> class proxy { ValT* arr; friend class Map; proxy( ValT* arr ): arr{arr} {} public: ValT& operator[]( std::size_t i ) { return arr[i]; } }; public: Map() : data{} {} proxy<const bool> operator[]( std::size_t x ) const { return proxy<const bool>{ data + x*23 }; } proxy<bool> operator[]( std::size_t x ) { return proxy< bool>{ data + x*23 }; } }; int main() { Map m; m[4][2] = true; }Edit: Verflucht seist du, Braunschwein!
-
@Sone: Warum ist das proxy-Objekt privat?
-
typedef std::array<23, std::array<79, bool>> map;
-
SeppJ schrieb:
typedef std::array<23, std::array<79, bool>> map;:p Andersum. Erst Typ, dann Size.
-
sternbein schrieb:
@Sone: Warum ist das proxy-Objekt privat?
Mir ist klar, dass man auch so auf den Typ zugreifen kann. Einfach so, nehme ich an.
-
out schrieb:
SeppJ schrieb:
typedef std::array<23, std::array<79, bool>> map;:p Andersum. Erst Typ, dann Size.
Ach, ich kann das nie auswendig behalten. Statisch dimensionierte Arrays benutze ich ehrlich gesagt nur sehr selten

-
SeppJ schrieb:
out schrieb:
SeppJ schrieb:
typedef std::array<23, std::array<79, bool>> map;:p Andersum. Erst Typ, dann Size.
Ach, ich kann das nie auswendig behalten. Statisch dimensionierte Arrays benutze ich ehrlich gesagt nur sehr selten

Ich finds logisch. Man fragt doch immer zuerst nach dem was, und dann nach demwie(viele).
-
Ich habe es vorher auch verwechselt, aber man muss sich vorstellen, dass es einfach wie bei der Deklaration eines echten Arrays aussieht: Erst die Typangabe, dann die Bounds.
-
Ja, die Analogie ist mir schon klar :p . Ich find's andersrum aber übersichtlicher, denn oft verschachtelt man die Arrays:
array<superlange typangabe<mit vielen<verschachtelten>, templates>, wie viele>Da muss man beim Lesen viel hin und her springen, ebenso beim Schreiben. Andersrum hingegen hat man all die schnell erfassbaren Informationen auf einen Blick, danach kann man sich die dicke Typangabe ansehen. Daher mache ich es intuitiv oft falsch herum. Aber die Reihenfolge, wie sie ist, ist in der Sprache schon so tief verwurzelt, es wäre inkonsistent das in diesem Fall anders zu machen.
-
Man kann die Umwandlung auch dem Compiler überlassen
#include <array> #include <cstddef> template <typename T> struct identity { using type = T; }; template <typename T> using eval = typename T::type; template <typename T> struct make_std_array : identity<T> {}; template <typename T, std::size_t N> struct make_std_array<T[N]> : identity<std::array<eval<make_std_array<T>>,N>> {}; template <typename T> using std_array = eval<make_std_array<T>>; #include <type_traits> static_assert( std::is_same<std_array<int[3][4]>, std::array<std::array<int, 4>, 3>>::value, "" );
-
Nun ja, das ist ja auch nicht schwer. Ein Multidimensionales Array ist ein Array von Arrays. Und leider gibt es keine Array-Bounds als pack-expansion pattern...
Aber camper hat immer die besten Ideen. Das ist nicht fair!
