 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
André Pönitz Guest
|
Posted: Thu Nov 27, 2003 11:41 am Post subject: 'Echte typedefs' |
|
|
Ich hab derzeit ca. 50 Instanzen von Code in der Art
typedef ops_base<aa1, bb1> base1;
struct ops1 : public base1
{
ops1(const foo & G, const bar & P)
: base(G, P)
{}
};
void do_something(ops1 & Z) {}
void do_something_else(ops1 & Z) {}
typedef ops_base<aa2, bb2> base2;
struct ops2 : public base2
{
ops2(const foo & G, const bar & P)
: base(G, P)
{}
};
// kein do_something hier, da die default-version 'passt'
void do_something_else(ops2 & Z) {}
[...]
Der einzige Grund dafuer ist, dass ich eine default-version
template <class Op> void do_something(Op &)
{
// default-version
}
habe, die haeufig verwendet wird, und die ich nicht jedesmal angeben
moechte.
Nun brauch ich fuer diese statisch Ueberladung zwingend verschiedene
Typen. Deswegen auch 'struct ops1 : public base1 {...}' und nicht
einfach 'typedef base1 ops1;'. Dann muss ich aber die Konstruktoren von
'base1' nach 'ops1' durchschleifen.
Gibt es irgend'n Trick, bei dem ich mit 'nem typedef auskommen kann?
[Ich bin schon kurz davor, ein Makro dafuer zu verwenden. Ist das der
einzige Weg?]
Andre'
--
Those who desire to give up Freedom in order to gain Security, will not have,
nor do they deserve, either one. (T. Jefferson or B. Franklin or both...)
--
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 |
|
 |
Ludwig Pumberger Guest
|
Posted: Thu Nov 27, 2003 12:19 pm Post subject: Re: 'Echte typedefs' |
|
|
André Pönitz schrieb:
| Quote: | Nun brauch ich fuer diese statisch Ueberladung zwingend verschiedene
Typen. Deswegen auch 'struct ops1 : public base1 {...}' und nicht
einfach 'typedef base1 ops1;'. Dann muss ich aber die Konstruktoren von
'base1' nach 'ops1' durchschleifen.
|
Ich hab jetzt zwar dein obiges Beispiel nicht genau verstanden, aber mir
würde hier sowas ala
template <typename T, int id>
struct StrictTypedef : public T
{
....
StrictTypedef() : T(){}
template <typename A>
explicit StrictTypedef(const A &a) : T(a){}
usw.
};
einfallen. Wobei die unschönen Templatekonstruktoren durch mehr Wissen
über die Basis wegfallen können.
Und dann typedef StrictTypedef<OriginalType, 0> NewType;
Das Hauptproblem bei dem ganzen Ansatz ist IMO dass eine Ableitung logisch
etwas anderes als ein "echter" typedef ist. Dazu kommt hier noch dass der
id Parameter auch nicht besonders hübsch zu verwenden ist. Sofern das für
dein Problem passt sollte es aber immer noch schöner als ein Makro sein.
HTH Ludwig
--
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 |
|
 |
André Pönitz Guest
|
Posted: Thu Nov 27, 2003 12:21 pm Post subject: Re: 'Echte typedefs' |
|
|
Ludwig Pumberger <elpeka (AT) gmx (DOT) at> wrote:
| Quote: | André Pönitz schrieb:
Nun brauch ich fuer diese statisch Ueberladung zwingend verschiedene
Typen. Deswegen auch 'struct ops1 : public base1 {...}' und nicht
einfach 'typedef base1 ops1;'. Dann muss ich aber die Konstruktoren von
'base1' nach 'ops1' durchschleifen.
Ich hab jetzt zwar dein obiges Beispiel nicht genau verstanden, aber mir
würde hier sowas ala
template
struct StrictTypedef : public T
{
...
StrictTypedef() : T(){}
template
explicit StrictTypedef(const A &a) : T(a){}
usw.
};
einfallen. Wobei die unschönen Templatekonstruktoren durch mehr Wissen
über die Basis wegfallen können.
|
Die Basis ist eine Klasse, die im wesentlichen nur Daten enthaelt, wobei
diese von zwei Template-Parametern abhaengt.
Im Prinzip spricht nix dagegen, da noch einen Template-Parameter 'id'
dazuzupacken.
| Quote: | Das Hauptproblem bei dem ganzen Ansatz ist IMO dass eine Ableitung logisch
etwas anderes als ein "echter" typedef ist.
|
Naja, die semantischen i-Tuepfelchen spielen in dem Fall eher nur die
zweite Geige, es geht darum, den Code kompakt und uebersichtlich zu
bekommen. Die 'Standardanwendung' wird spaeter eher 'cut&paste-style
programming sein'.
| Quote: | Dazu kommt hier noch dass der id Parameter auch nicht besonders
hübsch zu verwenden ist. Sofern das für dein Problem passt sollte es
aber immer noch schöner als ein Makro sein.
|
Ich schau mal. Danke fuer die Idee.
Andre'
--
Those who desire to give up Freedom in order to gain Security, will not have,
nor do they deserve, either one. (T. Jefferson or B. Franklin or both...)
--
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 |
|
 |
Markus Schaaf Guest
|
Posted: Thu Nov 27, 2003 1:05 pm Post subject: Re: 'Echte typedefs' |
|
|
"André Pönitz" <poenitz (AT) gmx (DOT) net> schrieb:
| Quote: | struct ops2 : public base2
{
ops2(const foo & G, const bar & P)
: base(G, P)
{}
};
// kein do_something hier, da die default-version 'passt'
void do_something_else(ops2 & Z) {}
[...]
Der einzige Grund dafuer ist, dass ich eine default-version
template <class Op> void do_something(Op &)
{
// default-version
}
habe, die haeufig verwendet wird, und die ich nicht jedesmal angeben
moechte.
Nun brauch ich fuer diese statisch Ueberladung zwingend verschiedene
Typen. Deswegen auch 'struct ops1 : public base1 {...}' und nicht
einfach 'typedef base1 ops1;'. Dann muss ich aber die Konstruktoren von
'base1' nach 'ops1' durchschleifen.
Gibt es irgend'n Trick, bei dem ich mit 'nem typedef auskommen kann?
[Ich bin schon kurz davor, ein Makro dafuer zu verwenden. Ist das der
einzige Weg?]
|
Wie wär's mit einem Template, das einen zusätzlichen Typen als Parameter
nimmt?
enum bla_tag; typedef t< bla_tag > bla;
Falls da mehr Schreibaufwand dazukäme, wäre eine zusätzliche Indirektion
möglich:
enum bla_tag; typedef t< bla_tag >::t bla;
Makros sind natürlich trotzdem nicht verkehrt, zumal man sie ja am Ende
des Headers wieder #undef -en kann. Diese Abneigung gegen den Präprozessor
ist völlig dämlich.
MfG
--
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 |
|
 |
André Pönitz Guest
|
Posted: Thu Nov 27, 2003 1:33 pm Post subject: Re: 'Echte typedefs' |
|
|
Ludwig Pumberger <elpeka (AT) gmx (DOT) at> wrote:
| Quote: | template
struct StrictTypedef : public T
{
...
StrictTypedef() : T(){}
template
explicit StrictTypedef(const A &a) : T(a){}
usw.
};
|
Ah... geht. Im Prinzip hat Deine Idee gereicht, die 'echte
Zwischenklasse' als Template zu implementieren und nicht als
'normale' Klasse. Ich brauch nicht mal die IDs dafuer.
Irgendwie frag ich mich, warum ich da nicht selbst draufgekommen bin.
Danke jedenfalls nochmal (auch an Markus...)
Andre'
--
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 |
|
 |
André Pönitz Guest
|
Posted: Thu Nov 27, 2003 1:34 pm Post subject: Re: 'Echte typedefs' |
|
|
Markus Schaaf <markus (AT) sags-per-mail (DOT) de> wrote:
| Quote: | Makros sind natürlich trotzdem nicht verkehrt, zumal man sie ja am Ende
des Headers wieder #undef -en kann. Diese Abneigung gegen den Präprozessor
ist völlig dämlich.
|
Naja, ich versuch normalerweise erst 'ne Loesung ohne Makros. Wenn's so
nicht oder nur haesslich geht, dann halt mit.
Andre'
--
Those who desire to give up Freedom in order to gain Security, will not have,
nor do they deserve, either one. (T. Jefferson or B. Franklin or both...)
--
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
|
|