Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

1

28.08.2012, 20:04

C++: Kleines Code-Beispiel um C#'s "is" zu Simulieren

Hallo Community,
mir ist die idee gekommen, dass man doch in C++ ein Schlüsselwort is oder isoftype gebrauchen könnte (wie in C#).
Ich habe dafür folgende lösung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<class T, class Other>
struct _isRelated
{
    typedef char yes_t;
    typedef double no_t;

    static yes_t check(Other*);
    static no_t check(...);

    enum { value = sizeof(check(static_cast<T*>(0))) == sizeof(yes_t) };
};

#ifndef _TYPEOF_DEFINED_
#define _TYPEOF_DEFINED_
#define typeof _isRelated<decltype(
#define is(type) ), type>::value
#endif

Man würde es dann so benutzen:

C-/C++-Quelltext

1
2
3
4
5
void bsp(T * obj)
{
   if(typeof *obj is(MyClassXYZ))
    //...
}

Was haltet ihr davon?
MfG, RmbRT
"Dumm ist, wer dummes tut."

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

28.08.2012, 20:53

Halte ich für ganz... ungut.

C-/C++-Quelltext

1
2
3
4
5
6
7
class A : X { }

class B : X { }

B* b;
if ( typeof b is ( A ) )
    cout << "sad trombone";


Syntaktisch und semantisch ok, funktional eher nicht so richtig.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

3

28.08.2012, 21:14

naja wieso denn, also zuerst vergleichst du B* mit A, ist glaube ich aber nicht das, worauf du hinaus willst.
und in C# wäre es ja doch genau so (oder was meinst du genau)?
Edit: Oh, jetzt sehe ich das auch...
gibt es da einen weg, es besser zu lösen? Ich habe es bis jetzt nur mit der methode gesehen...
Edit2:

C-/C++-Quelltext

1
2
_isRelated<B,A>::value = false
_isRelated<B&,A>::value = true //B& durch dereferenzierung
8|
"Dumm ist, wer dummes tut."

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »RmbRT« (28.08.2012, 21:21)


CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

4

28.08.2012, 21:50

Siehe std::remove_reference und std::remove_pointer. Dein _isRelated findet sich ebenfalls in der Standardbibliothek unter std::is_base_of.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

5

28.08.2012, 23:30

danke für den hinweis, aber es sollte ja nur die verwendung darstellen.
ke nnt eigentlich jemand den grund, warum A& und B, aber nicht A und B miteinander verwandt sind?
"Dumm ist, wer dummes tut."

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

28.08.2012, 23:36

Wieso genau sollten A und B deiner Meinung nach "miteinander verwandt" sein?

Imo sollte zu dem Ganzen unbedingt noch gesagt werden, dass die Notwendigkeit eines is praktisch immer Symptom eines Designproblems ist. Anstatt solche Konstrukte nachzubauen, sollte man imo besser versuchen, das Design zu fixen. ;)

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

7

28.08.2012, 23:48

Da hast du natürlich Recht, es ist auch nur für eine "Bibliothek" aus lauter kleinen Übungen und Spielereien mit der Sprache :D
und meine annahme, dass A& und B miteinander verwandt sind, kommt vom intellisense ...
MfG, RmbRT
"Dumm ist, wer dummes tut."

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

28.08.2012, 23:56

Zeig mal den genauen Code, der dich zu der Annahme verleitet hat. ;)

Btw, eine klitzekleine Anmerkung zu oben vielleicht noch: Als no_t wäre es ganz streng genommen besser, z.B. ein

C-/C++-Quelltext

1
2
3
4
struct no_t
{
  char blub[2];
};

zu verwenden, da char theoretisch gleich groß sein könnte wie double, auch wenn dies praktisch wohl natürlich nirgendwo der Fall sein wird.

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

9

29.08.2012, 00:03

Also ich hab genau den code von oben in visual c++ 2010 benutzt, und dann:

C-/C++-Quelltext

1
const int test=typeof *b is(A);
Intellisense sagt, test = 1. Ich kann mir das nicht erklären.
Du kannst es ja mal bei dir testen...
MfG, RmbRT
"Dumm ist, wer dummes tut."

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

29.08.2012, 00:12

Was genau für einen Typ hat b und was ist A? Und sagt das nur IntelliSense oder auch der Compiler selbst?

Werbeanzeige