2013-05-21 5 views
16

Gibt es ein std::empty Struktur oder etwas ähnliches oder muß ich meine eigene definieren:Ist leere Struktur durch den C++ - Standard definiert?

struct empty{}; 

Dies in Kombination sehr schön mit std::conditional oder anderen neuen std Funktionen verwendet werden kann, und ich frage mich, ob der Standard es definiert oder nicht.

+2

Nach bestem Wissen und Gewissen, nein:


Es wäre die folgende Art und Weise definiert werden. –

+0

Möchten Sie eine Struktur, die nur keine Datenelemente (also eine Größe von 1) oder eine wirklich leere Struktur haben? – kennytm

+3

Vielleicht 'std :: tuple <>'? – jogojapan

Antwort

5

Es gibt so etwas in der C++ - Standardbibliothek nicht. Wie in den Kommentaren erwähnt, können Sie immer noch boost::blank in Boost finden, was wahrscheinlich am ehesten der Klasse entspricht, nach der Sie suchen. Wenn eine solche Klasse in der Standardbibliothek existiert, glaube ich nicht, dass es so viele Bibliotheken von Drittanbietern geben würde, die ihre eigenen struct empty {} definieren.

Wenn Sie wollen, ist nur eine Klasse ohne Datenelemente und die kleinstmögliche Größe - kann nicht kleiner als 1 sein - (und möglicherweise von der leeren Basisoptimierung profitieren), können Sie immer noch verwenden. Es wird tatsächlich für genau diesen Zweck (leere Basisoptimierung) bei der Implementierung einiger Klassen in libstdC++ verwendet.

Wenn Sie sicher std::tuple<> wirklich machen wollen, ist eine leere Klasse:

#include <iostream> 
#include <tuple> 
#include <type_traits> 

int main() 
{ 
    // prints 1 
    std::cout << std::is_empty< std::tuple<> >::value; 
} 
4

Wenn ich Ihre Frage richtig verstanden habe, werden Sie mit std::conditional für die Verwendung für einen Fehlerrückgabetyp suchen. Üblicherweise definieren Leute ihre eigenen leeren Strukturtypen für die Metaprogrammierung. Dies ist sinnvoll, da es normalerweise nicht möglich ist, Metaprogrammierungsbibliotheken so zu gestalten, dass sie leicht mit beliebigen anderen Kompilierzeitbibliotheken interagieren können.

Die nächste Sache zu einem de-facto-Standard ist wahrscheinlich Boost.MPL, also könnte etwas wie mpl::void_ in Ihrer Situation sinnvoll sein.

Wenn Sie auf Standard-Typen bestehen, scheint nullptr_t eine gute Übereinstimmung zu sein.

+1

Die Verwendung von 'nullptr_t' ist eigentlich eine gute Idee. – jleahy

+0

Das einzige Problem von 'nullptr_t' ist, dass es, falls vorgesehen, mindestens so groß wie eine 'void *' - Instanz sein muss. Dies sollte kein Problem sein, wenn die Metaprogrammierung nur verwendet wird. – Morwenn

2

Es gibt einen Abschnitt, um diese Art von Konstrukt als Teil der Variant proposal (n4542) hinzuzufügen.

Nachdem abgestimmt,

Was wir das „empty_t“ Stand-in-Typ nennen wollen?
empty_t 4
leer 4
one_t 1
blank 6
blank_t 7
monostate 7

Runoff:
blank * 3
monostate 8

die auf Namen vereinbart hätten sei: std :: monostate.

// 2.?, Explicitly default-constructed alternative 
struct monostate {}; 
bool operator<(const monostate&, const monostate&) constexpr 
{ return false; } 
bool operator>(const monostate&, const monostate&) constexpr 
{ return false; } 
bool operator<=(const monostate&, const monostate&) constexpr 
{ return true; } 
bool operator>=(const monostate&, const monostate&) constexpr 
{ return true; } 
bool operator==(const monostate&, const monostate&) constexpr 
{ return true; } 
bool operator!=(const monostate&, const monostate&) constexpr 
{ return false; } 
Verwandte Themen