2016-03-03 13 views
5

Jaki jest najlepszy sposób na trzy wartości zmiennej Boolean w C++?nie ustawiono wartości logicznej w C++

Chciałbym mieć pola ustawione na true, false lub nie ustawić w ogóle w mojej tablicy.

Jeśli oświadczam do nich w ten sposób:

t[0] = true; 
t[1] = false; 
t[2] = NULL; 

Podczas badania stanu uzyskać:

t[2] jest false

+3

Utwórz wyliczenie trzymające trzy wartości: – Martin

+0

boolen lub boolean? – Nik

Odpowiedz

2

Możesz użyć boost :: opcjonalnie

http://www.boost.org/doc/libs/1_60_0/libs/optional/doc/html/index.html

boost::optional<bool> myBooleanVariable; 

Zgadzam się, że tribool może być lepiej, jeśli nie potrzebujemy wartości zainicjalizowana być NULL. Gdzie porównując opcjonalne i tribool dokumentacja mówi:

Po pierwsze, jest funkcjonalnie podobny do Tristate Boolean (false, może, true) -such jak boost :: tribool- tym wyjątkiem, że w Tristate logiczną, taką być może Stan reprezentuje poprawną wartość, w przeciwieństwie do odpowiedniego stanu niezainicjowanego opcjonalnie. Należy dokładnie rozważyć, czy naprawdę potrzebny jest opcjonalny zamiast triboola.

Źródło: http://www.boost.org/doc/libs/1_60_0/libs/optional/doc/html/boost_optional/a_note_about_optional_bool_.html

3

Rozważ użycie std::experimental::optional<bool> (jeśli C++ Standardowa biblioteka ma go) lub boost::optional<bool> (www.boost.org).

Wierzę, że std::optional jest kandydatem do C++ 17, więc jeśli przyjmiesz jedną z powyższych, twój wysiłek refaktoryzacji do C++ 17 powinien być minimalny.

Jeśli nie lubisz używać rzeczy, które nie są (jeszcze?) W "właściwego" C++ biblioteki standardowej, a następnie rozważyć

  1. Coś w oparciu wokół std::unique_ptr<bool>

  2. std::pair<bool, bool>

  3. Dobry staromodny enum z 3 wartościami.

3

chciałbym zwykle zrobić:

t[0] = true; 
t[1] = false; 
t[2] = -1; 

Albo jeśli trzeba tylko 3 stany, ale być może chciałby więcej w pewnym momencie, enum jest wielki:

enum STATES 
{ 
    NULL_STATE = -1, // you can manually specify -1 to give it a special case value 
    FALSE,    // will be equal to 0 
    TRUE    // will be equal to 1 
}; 

Bez względu na to, co jednak 0/false jest jedyną rzeczą, która zwraca false w oświadczeniu if().-1 i true zarówno zwracają true.

Możesz użyć przełącznika tak, aby radzić sobie z 3+ stanach:

switch (var) // may need to cast: (int)var 
{ 
case 1: 
case 0: 
case -1: 
}; 

Alternatywnie, jeśli chcesz, aby trzymać się blok if oświadczenie, można zrobić coś takiego:

if (var == -1) // or (var == NULL_STATE) 
{} 
else if (var)  // true condition 
{} 
else    // false 
{} 
Powiązane problemy