2013-05-21 17 views
16

Czy istnieje std::empty struct lub coś podobnego, czy trzeba zdefiniować własną rękę:Czy pusta struktura zdefiniowana jest przez C++?

struct empty{}; 

ten może być używany bardzo miły w połączeniu z std::conditional lub innych nowych funkcji std i zastanawiam się, czy norma określa, czy nie.

+2

do mojej najlepszej wiedzy, nie. –

+0

Czy chcesz struct, który po prostu nie ma członków danych (a więc mają rozmiar 1), czy naprawdę pustą strukturę? – kennytm

+3

Być może 'std :: tuple <>'? – jogojapan

Odpowiedz

5

Nie ma czegoś takiego w standardowej bibliotece C++. Jak wspomniano w komentarzach, nadal możesz znaleźć boost::blank w Boost, co prawdopodobnie najbardziej przypomina klasę, której szukasz. Gdyby taka klasa istniała w standardowej bibliotece, nie sądzę, że byłoby tak wiele bibliotek stron trzecich definiujących swoje własne struct empty {}.

Jeśli potrzebna jest tylko klasa bez elementów danych i najmniejszy możliwy rozmiar - nie może być mniejsza niż 1 - (i być może skorzystać z pustej optymalizacji podstawy), nadal można użyć std::tuple<>. W rzeczywistości jest używany do tego celu (optymalizacja pustej bazy) w implementacji niektórych klas w libstdC++.

Jeśli chcesz się upewnić std::tuple<> naprawdę jest pusta klasa:

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

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

Jeśli dobrze rozumiem pytanie, szukasz powrotnej typu błędu za korzystanie z std::conditional. Zwykle ludzie definiują własne puste typy struktur dla metaprogramowania. Ma to sens, ponieważ zwykle nie jest możliwe zaprojektowanie bibliotek metaprogramowania w taki sposób, aby mogły one łatwo współpracować z dowolnymi innymi bibliotekami kompilacji.

Najbliższy faktyczny standard to prawdopodobnie Boost.MPL, więc użycie czegoś takiego jak mpl::void_ może mieć sens w twojej sytuacji.

Jeśli nalegasz na trzymanie się typów standardowych, nullptr_t wydaje się być dobrym dopasowaniem.

+1

Używanie 'nullptr_t' w tym przypadku jest całkiem niezłym pomysłem. – jleahy

+0

Jedyny problem z 'nullptr_t' polega na tym, że jeśli jest on inicjowany, musi być co najmniej tak duży jak instancja' void * '. Nie powinno to stanowić problemu, jeśli jedynym zastosowaniem jest metaprogramowanie. – Morwenn

2

Istnieje dział dodający ten rodzaj konstrukcji jako część Variant proposal (n4542).

Po głosowanie,

Czego chcemy nazywać „empty_t” stand-in typu?
empty_t 4
pusty 4
one_t 1
puste 6
blank_t 7
monostate 7

Runoff:
puste * 3
monostate 8

uzgodnione nazwą byłoby be: std :: monostate.


byłoby zdefiniowane w następujący sposób:

// 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; }