 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Tibor Pausz Guest
|
Posted: Mon Sep 27, 2004 7:24 pm Post subject: Erweiterter operator[] |
|
|
Ist für die neuen C++ Norm eine Erweiterung des Operators[] geplant?
Es wäre sehr praktisch, wenn dieser nicht nur auf ein Argument
beschränkt bliebe. Damit könnte man u.a. bessere Matrixklassen
schreiben.
Z.B.
template <typename T>
class demo {
public:
demo (size_t x, size_t y);
T& operator[] (size_t,size_t);
};
Und benutzt würde das ganze in der Form
demo<int> m(100,200);
m[5,6] = 50;
Und wenn das nicht der Fall ist, bestehen reale Chancen das noch für die
nächste C++ Norm vorzutragen?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Tommi Mäkitalo Guest
|
Posted: Tue Sep 28, 2004 7:02 am Post subject: Re: Erweiterter operator[] |
|
|
Tibor Pausz wrote:
....
Ist das denn so viel besser als
m[5][6] = 50;
"T& operator[] (size_t)" liefert ein Objekt, welches den operator[] (size_t)
in geeigneter Weise überschreibt.
Tommi
--
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Tue Sep 28, 2004 9:48 am Post subject: Re: Erweiterter operator[] |
|
|
[email]pausz (AT) stud (DOT) uni-frankfurt.de[/email] (Tibor Pausz) wrote in message
news:<1gksevv.1kjg911ulwcobN%pausz (AT) stud (DOT) uni-frankfurt.de>...
| Quote: | Ist für die neuen C++ Norm eine Erweiterung des Operators[] geplant?
|
Nein.
| Quote: | Es wäre sehr praktisch, wenn dieser nicht nur auf ein Argument
beschränkt bliebe. Damit könnte man u.a. bessere Matrixklassen
schreiben.
Z.B.
template <typename T
class demo {
public:
demo (size_t x, size_t y);
T& operator[] (size_t,size_t);
};
Und benutzt würde das ganze in der Form
demo
m[5,6] = 50;
|
Das Problem besteht darin, dass »m[5,6] = 50« schon legal ist, und hat
eine definierte Semantik, dass man normalerweise nicht ändern darf.
| Quote: | Und wenn das nicht der Fall ist, bestehen reale Chancen das noch für
die nächste C++ Norm vorzutragen?
|
Sicher nicht. Besonders weil es schon die Möglichkeiten gibt, entweder
»m[5][6] = 50« oder »m(5,6) = 50« zu benutzen.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Torsten Robitzki Guest
|
Posted: Tue Sep 28, 2004 6:27 pm Post subject: Re: Erweiterter operator[] |
|
|
Tibor Pausz wrote:
| Quote: | Ist für die neuen C++ Norm eine Erweiterung des Operators[] geplant?
Es wäre sehr praktisch, wenn dieser nicht nur auf ein Argument
beschränkt bliebe. Damit könnte man u.a. bessere Matrixklassen
schreiben.
Z.B.
template <typename T
class demo {
public:
demo (size_t x, size_t y);
T& operator[] (size_t,size_t);
};
Und benutzt würde das ganze in der Form
demo
m[5,6] = 50;
Und wenn das nicht der Fall ist, bestehen reale Chancen das noch für die
nächste C++ Norm vorzutragen?
|
Hm, warum nicht m[5][6] = 50; ? Das wäre meiner Meinung nach viel
C++ischer André Pönitz hatte aber glaube ich mal einen 'Vorschlag'
mit einer Parameterklasse und einem operator,().
mfg Torsten
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Michael Trocken Guest
|
Posted: Wed Sep 29, 2004 6:34 pm Post subject: Re: Erweiterter operator[] |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote in message news:<d6652001.0409280148.5791f431 (AT) posting (DOT) google.com>...
| Quote: | pausz (AT) stud (DOT) uni-frankfurt.de (Tibor Pausz) wrote in message
news:<1gksevv.1kjg911ulwcobN%pausz (AT) stud (DOT) uni-frankfurt.de>...
Ist für die neuen C++ Norm eine Erweiterung des Operators[] geplant?
Es wäre sehr praktisch, wenn dieser nicht nur auf ein Argument
beschränkt bliebe. Damit könnte man u.a. bessere Matrixklassen
schreiben.
Z.B.
template <typename T
class demo {
public:
demo (size_t x, size_t y);
T& operator[] (size_t,size_t);
};
Und benutzt würde das ganze in der Form
demo
m[5,6] = 50;
Das Problem besteht darin, dass »m[5,6] = 50« schon legal ist, und hat
eine definierte Semantik, dass man normalerweise nicht ändern darf.
|
Aber man könnte es so definieren, dass die Semantik für »m[5,6]« bei
Klassen, die mit der bisherigen Syntax geschrieben sind, gleich
bleibt, und dass sich nur für Klassen mit der Sprach-Erweiterung eine
andere Bedeutung für »m[5,6]« ergibt. Das hätte zwar vermutlich eine
gewisse Verwechslungsgefahr zur Folge, aber grundsätzlich möglich wäre
es schon, eine neue Syntax auf dieser Basis zu definieren, ohne die
Bedeutung bestehender Programme zu verändern.
Die Frage ist auch, ob bisherige Konstrukte wie »m[5,6]« nicht eher in
die Kategorie "bislang unentdeckte Fehler" gehören. Eine Warnung, bei
nach bestehender Syntax definiertem operator[] in solchen Fällen
könnte da aufschlussreich sein. Und wer wirklich den Komma-Operator
gemeint hat, der könnte immer noch »m[(5,6)]« schreiben, um die
Warnung zu unterdrücken.
Michael
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Tibor Pausz Guest
|
Posted: Fri Oct 01, 2004 8:56 am Post subject: Re: Erweiterter operator[] |
|
|
<kanze (AT) gabi-soft (DOT) fr> wrote:
| Quote: | Das Problem besteht darin, dass »m[5,6] = 50« schon legal ist, und hat
eine definierte Semantik, dass man normalerweise nicht ändern darf.
|
Was habe ich übersehen?
| Quote: | Sicher nicht. Besonders weil es schon die Möglichkeiten gibt, entweder
»m[5][6] = 50« oder »m(5,6) = 50« zu benutzen.
|
Das erstere geht nicht, da man den Operator[] nicht so überladen kann
ohne nicht eine Hilfklasse zu benutzen. Das zweite widerspricht der
Philosophie vom Operator [].
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Tibor Pausz Guest
|
Posted: Fri Oct 01, 2004 8:56 am Post subject: Re: Erweiterter operator[] |
|
|
Torsten Robitzki <MyFirstname (AT) Robitzki (DOT) de> wrote:
| Quote: | Hm, warum nicht m[5][6] = 50; ? Das wäre meiner Meinung nach viel
C++ischer
|
Weil man dann eine Hilfklasse braucht (die Syntax gibt es schon) und es
wäre mehr C-like.
| Quote: | André Pönitz hatte aber glaube ich mal einen 'Vorschlag'
mit einer Parameterklasse und einem operator,().
|
Werde mal danach suchen.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Tibor Pausz Guest
|
Posted: Fri Oct 01, 2004 8:57 am Post subject: Re: Erweiterter operator[] |
|
|
Tommi Mäkitalo <t.maekitalo (AT) epgmbh (DOT) nowhere.de> wrote:
| Quote: | Ist das denn so viel besser als
m[5][6] = 50;
|
Ja, wäre es. Denn m[5][6] bedeutet,
row demo::operator[] (size_t)
liefert etw ein row Objekt zurück, das mit
T row::operator[] (size_t)
nochmals dereferenziert werden muß.
So ein Verhalten kann man jetzt schon bekommen durch
std::vector<std::vector m;
// init Code
dies erlaubt die Objekte mittels
m[0][1] = 50;
zu adressieren.
Aber man kann so nicht in _einem_ Matrixobjekt den kompletten
Speicherbedarf ermitteln und mit einem einzigem new[] den Speicher
anfordern. Der Overhead wird größer und auf einem Multitasking System
ist jedes malloc/new langsam. Jetzt denk einmal an eine 7 dimensionale
Matrix.
m[0][0][0][0][0][0][0] = 1;
Allokier mal für so ein Konstrukt den Speicher! Mit einem Operator so
wie von mir vorgeschlagen mußt Du bloß einmal den gesamten Block
allokieren.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Fri Oct 01, 2004 9:36 am Post subject: Re: Erweiterter operator[] |
|
|
Tibor Pausz wrote:
| Quote: |
[email]kanze (AT) gabi-soft (DOT) fr[/email]> wrote:
Das Problem besteht darin, dass »m[5,6] = 50« schon legal ist, und hat
eine definierte Semantik, dass man normalerweise nicht ändern darf.
Was habe ich übersehen?
|
m[5,6]
ist identisch zu m[6]
Stichwort: Komma-Operator
| Quote: |
Sicher nicht. Besonders weil es schon die Möglichkeiten gibt, entweder
»m[5][6] = 50« oder »m(5,6) = 50« zu benutzen.
Das erstere geht nicht, da man den Operator[] nicht so überladen kann
ohne nicht eine Hilfklasse zu benutzen.
|
Also gehts doch
Zugegeben, man muss ein bischen Aufwand treiben. Der Benutzer der Klasse
merkt aber nichts davon.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Marcel Müller Guest
|
Posted: Fri Oct 01, 2004 10:21 am Post subject: Re: Erweiterter operator[] |
|
|
Tibor Pausz wrote:
| Quote: | m[0][0][0][0][0][0][0] = 1;
Allokier mal für so ein Konstrukt den Speicher! Mit einem Operator so
wie von mir vorgeschlagen mußt Du bloß einmal den gesamten Block
allokieren.
|
Das geht trotzdem.
Voraussetzung ist, daß die erforderlichen Hilfsklassen Referenzen auf
den ursprünglichen Datentyp repräsentieren (also faktisch Views sind).
Die nötigen Informationen sind eigentlich nur ein value_type* auf das
erste Element und ein size_t increment, mit dem Abstand.
Zusätzlich müssen die Hilfsklassen eine Referenz auf die
Metainformationen (darunterliegende Dimensionen) halten - also noch ein
size_t*.
Es würde mich wundern, wenn man das nicht sogar mit /einer/
Template-Hilfsklasse hinbekommt, die die Dimension als
Template-Parameter hat. Für 0 muß man es dann natürlich spezialisieren.
Und fertig ist die erste Funktionalität einer Tensorklasse.
Hätte man den [,,,] Operator, könnte man die Sache nicht als Template
für beliebige Dimensionalitäten erschlagen.
Marcel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Tibor Pausz Guest
|
Posted: Sun Oct 03, 2004 7:41 am Post subject: Re: Erweiterter operator[] |
|
|
Karl Heinz Buchegger <kbuchegg (AT) gascad (DOT) at> wrote:
| Quote: | m[5,6]
ist identisch zu m[6]
Stichwort: Komma-Operator
|
Das dürfte eher unter die Fallstricke von C++ fallen und weniger um eine
gezielte Anwendung der Kommaoperators.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Mon Oct 04, 2004 2:27 pm Post subject: Re: Erweiterter operator[] |
|
|
Karl Heinz Buchegger <kbuchegg (AT) gascad (DOT) at> wrote
| Quote: | Tibor Pausz wrote:
[email]kanze (AT) gabi-soft (DOT) fr[/email]> wrote:
Sicher nicht. Besonders weil es schon die Möglichkeiten gibt,
entweder »m[5][6] = 50« oder »m(5,6) = 50« zu benutzen.
Das erstere geht nicht, da man den Operator[] nicht so überladen
kann ohne nicht eine Hilfklasse zu benutzen.
Also gehts doch
Zugegeben, man muss ein bischen Aufwand treiben. Der Benutzer der
Klasse merkt aber nichts davon.
|
Ein sehr bisschen Aufwand, weil im einfachsten Fall heißt die
»Hilfklasse« double*, oder so was.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|