[C++] Typ auf Default-Konstruktor prüfen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
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

Beitrag von Schrompf »

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
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] Typ auf Default-Konstruktor prüfen

Beitrag von dot »

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...
Benutzeravatar
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

Beitrag von Schrompf »

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.
Benutzeravatar
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

Beitrag von Krishty »

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?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [C++] Typ auf Default-Konstruktor prüfen

Beitrag von CodingCat »

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?
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?
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
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

Beitrag von Schrompf »

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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [C++] Typ auf Default-Konstruktor prüfen

Beitrag von CodingCat »

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.
Ja, das klingt vernünftig.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Antworten