2013-06-06 7 views
9

Beachten Sie zunächst, dass ich C++ 03 verwende (und C++ 11 ist keine Option). Ich bin mit Boost-Konzept zu überprüfen, ob eine bestimmte Klasse ist default-konstruierbar:Kann ich überprüfen, dass eine Klasse * nicht * standardmäßig konstruierbar ist?

BOOST_CONCEPT_ASSERT((boost::DefaultConstructible<my_class>)); 

jedoch für eine andere Klasse würde ich behaupten möchte, dass die Art tut nicht einen Standardkonstruktor haben. Gibt es eine Möglichkeit, dies zu tun?

Update: an alle diese super-duper Experten die Frage als duplikate oder bereits beantwortet, ohne es zu lesen: Ich sage im ersten Absatz, dass ich bereits Boost-Konzept zu verwenden, um zu überprüfen, dass Klassen standardmäßig konstruierbar sind ist die Frage, dass dies ein Duplikat sein soll). Ich erkläre auch ausdrücklich, dass ich C++ 11 nicht verwenden kann, also stehen mir type_traits nicht zur Verfügung. Also, könnte jemand bitte mich auf den spezifischen Teil verweisen, wo meine Frage "bereits beantwortet" wurde? Weil ich es noch nicht gefunden habe.

+3

Wenn Sie Zugriff auf entweder von TR1 oder von Compiler-Erweiterung haben, hat es die einfache Lösung. Auch der Compiler kann eine verwandte intrinsische Funktion haben. (d. h. VS2010 tut das) –

+0

und ich habe dich irgendwo verloren, fügt nicht hinzu! im zitierten Ausdruck, wonach du suchst? –

+0

@BalogPal: Soweit ich aus dem Code ersehen kann, funktionieren diese Behauptungen nicht, indem sie einen Wahrheitswert für irgendeinen Teil des Klammerausdrucks zurückgeben. Stattdessen ist eine Menge Makromagie beteiligt, aber es läuft darauf hinaus, für eine Funktion zu kodieren, die nicht kompiliert wird, wenn das fragliche Konzept nicht gilt. Code umzuwandeln, der nicht kompiliert wird und umgekehrt, ist zumindest schwierig. – MvG

Antwort

2

Das enttäuschende Bit ist, dass nein, dies ist nicht möglich mit Boost-Konzept überprüfen.

Das nicht so enttäuschende Bit ist: Versuchen Sie nicht, dieses Tool rückwärts zu verwenden?

Im Allgemeinen schreiben Sie Code, der einen Typ benötigt, der eine bestimmte Anzahl von Features hat, z. B. Konstruktoren, Funktionen, die für diesen Typ verwendet werden, und so weiter. Ich kann mir keine Situation vorstellen, in der Sie Code schreiben würden, der einen Typ benötigt, dem bestimmte Funktionen fehlen.

Sie scheinen nicht wollen, um Konzept-orientierte Programmierung zu tun, sondern um Codierungsstil zu erzwingen. Und das ist nicht das richtige Werkzeug dafür.

+1

... weil ein Typ, der mehr Merkmale aufweist als diejenigen, die zur Erfüllung eines Konzepts unbedingt erforderlich sind, dieses Konzept erfüllt. – migle

+0

Nein, nicht Codierungsstil. Ich benutze Vorlagen, und der eigentliche Typ wird extern vergeben, also muss ich bestimmte Dinge überprüfen.Der Grund, Standardkonstruktoren zu vermeiden, ist von Entwurf, und bewusst :) – Janoma

+1

... klingt wie coding style für mich ... – migle

Verwandte Themen