2016-03-03 21 views
5

Cách tốt nhất để có ba biến Boolean giá trị trong C++ là gì?không đặt giá trị boolean trong C++

Tôi muốn có các trường được đặt thành true, false hoặc không được đặt ở tất cả trong mảng của mình.

Nếu tôi khai báo theo cách này:

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

Khi tôi kiểm tra tình trạng này tôi nhận được:

t[2]false

+3

Tạo một enum giữ ba giá trị của bạn – Martin

+0

boolen hoặc boolean? – Nik

Trả lời

2

Bạn có thể sử dụng tăng :: tùy chọn

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

boost::optional<bool> myBooleanVariable; 

Tôi đồng ý rằng tribool có thể được tốt hơn nếu bạn không cần các giá trị uninitialised là NULL. Trong trường hợp so sánh tùy chọn và tribool, tài liệu nói:

Đầu tiên, nó là chức năng tương tự như một boolean tristate (false, có lẽ, true) -such như boost :: tribool- ngoại trừ trong một boolean tristate, các thể trạng thái đại diện cho một giá trị hợp lệ, không giống như trạng thái tương ứng của một tùy chọn uninitialized. Nó nên được xem xét cẩn thận nếu một tùy chọn thay vì một tribool là thực sự cần thiết.

Nguồn: http://www.boost.org/doc/libs/1_60_0/libs/optional/doc/html/boost_optional/a_note_about_optional_bool_.html

3

Xem xét sử dụng std::experimental::optional<bool> (nếu thư viện chuẩn C++ của bạn có nó), hoặc boost::optional<bool> (www.boost.org).

Tôi tin rằng std::optional là một ứng cử viên cho C++ 17 vì vậy nếu bạn áp dụng một trong những điều trên thì nỗ lực tái cấu trúc của bạn đến C++ 17 phải là tối thiểu.

Nếu bạn không thích sử dụng những thứ mà không phải là (chưa?) Trong C++ thư viện tiêu chuẩn "phù hợp", sau đó xem xét

  1. Something dựa trên std::unique_ptr<bool>

  2. Một std::pair<bool, bool>

  3. Một kiểu cũ enum có 3 giá trị.

3

Tôi thường sẽ làm:

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

Hoặc nếu bạn chỉ cần 3 tiểu bang nhưng có lẽ muốn biết thêm tại một số điểm, một enum là rất tốt:

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

Không có vấn đề gì mặc dù, 0/false là điều duy nhất trả về false trong câu hỏi if().-1true cả hai trở về true.

Bạn có thể muốn sử dụng một công tắc như thế này để đối phó với 3+ trạng thái:

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

Ngoài ra nếu bạn muốn dính vào một nếu khối tuyên bố, bạn có thể làm một cái gì đó như thế này:

if (var == -1) // or (var == NULL_STATE) 
{} 
else if (var)  // true condition 
{} 
else    // false 
{} 
Các vấn đề liên quan