Seite 1 von 1

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

Verfasst: 08.04.2013, 19:13
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

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

Verfasst: 08.04.2013, 19:20
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...

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

Verfasst: 08.04.2013, 19:24
von Schrompf
Danke für den Link, aber das scheint alles nur mit C++/.NET zu funktionieren.

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

Verfasst: 08.04.2013, 19:32
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?

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

Verfasst: 08.04.2013, 19:41
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?

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

Verfasst: 08.04.2013, 21:11
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.

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

Verfasst: 08.04.2013, 21:37
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.