Moin Leute!
Ich muss mal wieder an meine Factory-Klasse ran. Letztens habt ihr mir ja bereits heldenhaft dabei geholfen, die Fabrik sowohl für kopierbare als auch für nicht-kopierbare Typen zu spezialisieren, wobei die Kopierbarkeit automatisch aus dem Template-Parameter abgeleitet wird. Dafür nochmal ein dickes Dankeschön!
Da es keine wirkliche Möglichkeit gab, die Kopierbarkeit einer Klasse zu prüfen, prüfe ich stattdessen darauf, ob die Klasse von boost::noncopyable ableitet. Das geht ganz banal mit "std::is_base_of<boost::noncopyable, MeineKlasse>". Meine Frage lautet nun: gibt es auch irgendeine Möglichkeit, auf die Anwesenheit eines Standardkonstruktors zu testen?
Ha. Manchmal muss man nur die Frage tippen, um die Antwort nebenbei schon zu bekommen. Es gibt laut C++11-Standard unter anderem ein is_constructible<Typ, Param...> und ein is_copy_constructible<Typ>. Nur leider existieren diese Klassen nicht in der Microsoftschen Dokumentation zu <type_traits>. Was wahrscheinlich bedeutet, dass MS es für zu mühsam hielt, die korrekt zu implementieren.
Grmpf.
Bye, Thomas
[C++] Typ auf Default-Konstruktor prüfen
- Schrompf
- Moderator
- Beiträge: 5164
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
[C++] Typ auf Default-Konstruktor prüfen
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- dot
- Establishment
- Beiträge: 1746
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: [C++] Typ auf Default-Konstruktor prüfen
Möglicherweise hilft dir das: http://msdn.microsoft.com/en-us/library/ms177194.aspx
Auf den ersten Blick schauts mir aber so aus, als wäre zumindest is_constructible implementiert, zumindest in VC 11...
Auf den ersten Blick schauts mir aber so aus, als wäre zumindest is_constructible implementiert, zumindest in VC 11...
- Schrompf
- Moderator
- Beiträge: 5164
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: [C++] Typ auf Default-Konstruktor prüfen
Danke für den Link, aber das scheint alles nur mit C++/.NET zu funktionieren.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Krishty
- Establishment
- Beiträge: 8351
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [C++] Typ auf Default-Konstruktor prüfen
Nein; nur die, wo auch // compile with: /clr im Beispiel steht.
Aber soweit ich das sehe, kann man mit den Intrinsics nur prüfen, ob der Standardk’tor vom Compiler stammt (und nicht, ob einer existiert und zugreifbar ist).
Wie wäre das mit Ausnutzen der Überladung? Wenn ich zwei Funktionen
void foo(Bar const & = Bar());
void foo();
habe, welche wird dann aufgerufen werden, wenn ich foo() schreibe? Bzw. wie kann man die Priorität so verwurschteln, dass er zuerst die mit dem Default-Parameter ausprobiert?
Aber soweit ich das sehe, kann man mit den Intrinsics nur prüfen, ob der Standardk’tor vom Compiler stammt (und nicht, ob einer existiert und zugreifbar ist).
Wie wäre das mit Ausnutzen der Überladung? Wenn ich zwei Funktionen
void foo(Bar const & = Bar());
void foo();
habe, welche wird dann aufgerufen werden, wenn ich foo() schreibe? Bzw. wie kann man die Priorität so verwurschteln, dass er zuerst die mit dem Default-Parameter ausprobiert?
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: [C++] Typ auf Default-Konstruktor prüfen
Gar nicht. void foo(Bar const & = Bar()); wirft obendrein Fehler, weil Default-Argumente nicht unter SFINAE fallen. :-/ Ich befürchte, ohne type_traits-Unterstützung wird sich keine entsprechende Lösung finden lassen. Wie sieht das Problem denn im Kontext aus?Krishty hat geschrieben:Wie wäre das mit Ausnutzen der Überladung? Wenn ich zwei Funktionen
void foo(Bar const & = Bar());
void foo();
habe, welche wird dann aufgerufen werden, wenn ich foo() schreibe? Bzw. wie kann man die Priorität so verwurschteln, dass er zuerst die mit dem Default-Parameter ausprobiert?
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
- Schrompf
- Moderator
- Beiträge: 5164
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: [C++] Typ auf Default-Konstruktor prüfen
Der Kontext ist derselbe wie hier: http://zfx.info/viewtopic.php?f=4&t=2385
Ich habe eine Class Factory. Als Template-Klasse, damit ich sie nicht jedes Mal für verschiedene Vererbungshierarchien neuschreiben muss. Diese Class Factory deduziert bereits die Kopierbarkeit des Typs und bietet dann eine Kopier-Funktion an, die den wahren Typ der übergebenen Instanz ermittelt und dynamisch eine Kopie davon erzeugt. Jetzt habe ich aber grade eben eine neue kleine Klassenhierarchie da reingeschmissen, die dieses Mal keinen Standardkonstruktor anbietet. Ich brauche in dem Fall nur den Kopier-Mechanismus, ich will keine neuen Instanzen ohne Vorlage erzeugen.
Jetzt, wo ich das tippe, kommt es mir wie ein Designfehler vor. Es wäre vielleicht schlauer, eine separate Kopier-Factory zu erfinden, anstatt eine Klasse für zwei Aufgaben zu basteln und *beide* Aufgaben dann per Template-Gebastel optional zu machen.
Ich habe eine Class Factory. Als Template-Klasse, damit ich sie nicht jedes Mal für verschiedene Vererbungshierarchien neuschreiben muss. Diese Class Factory deduziert bereits die Kopierbarkeit des Typs und bietet dann eine Kopier-Funktion an, die den wahren Typ der übergebenen Instanz ermittelt und dynamisch eine Kopie davon erzeugt. Jetzt habe ich aber grade eben eine neue kleine Klassenhierarchie da reingeschmissen, die dieses Mal keinen Standardkonstruktor anbietet. Ich brauche in dem Fall nur den Kopier-Mechanismus, ich will keine neuen Instanzen ohne Vorlage erzeugen.
Jetzt, wo ich das tippe, kommt es mir wie ein Designfehler vor. Es wäre vielleicht schlauer, eine separate Kopier-Factory zu erfinden, anstatt eine Klasse für zwei Aufgaben zu basteln und *beide* Aufgaben dann per Template-Gebastel optional zu machen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: [C++] Typ auf Default-Konstruktor prüfen
Ja, das klingt vernünftig.Schrompf hat geschrieben:Jetzt, wo ich das tippe, kommt es mir wie ein Designfehler vor. Es wäre vielleicht schlauer, eine separate Kopier-Factory zu erfinden, anstatt eine Klasse für zwei Aufgaben zu basteln und *beide* Aufgaben dann per Template-Gebastel optional zu machen.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite