Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Tutorial指南

Basic usage基本用法
Renaming the indeterminate state為"不確定"狀態更名
tribool input/output輸入/輸出

Basic usage基本用法

tribool 類的作用類似於內置的bool類型,但它是用於三態布爾邏輯的。所謂三態就是:true, false, 和 indeterminate不確定, 前兩個等價於C++的bool類型,而最後一個則表示一種未知的布爾值(即可能是 truefalse, 我們不知道)。

tribool 類支持從 bool 值或它自己的 indeterminate 關鍵字轉換:

tribool b(true);
b = false;
b = indeterminate;
tribool b2(b);

tribool 可以在條件語句中轉換為 bool 值。如果tribool為 true,則轉換得到的 bool true,否則為 false。因此,以下寫法可用於判斷一個tribool當前所持的值為三態中的哪一態:

tribool b = some_operation();
if (b) {
// b is true
}
else if (!b) {
// b is false
}
else {
// b is indeterminate
}

tribool 支持三態邏輯操作符 ! (否), && (與), and || (或), 操作數可以是 booltribool 值。例如:

tribool x = some_op();
tribool y = some_other_op();
if (x && y) {
// both x and y are true
}
else if (!(x && y)) {
// either x or y is false
}
else {
// neither x nor y is false, but we don't know that both are true

if (x || y) {
// either x or y is true
}
}

同樣,tribool 支持三態的等值比較操作符 ==!=。這些操作符與C++中的"普通"等值比較操作不同,因為它們返回的是一個 tribool,由於我們可能不知道比較的結果(試想一下比較 trueindeterminate)。例如:

tribool x(true);
tribool y(indeterminate);

assert(x == x); // okay, x == x returns true
assert(x == true); // okay, can compare tribools and bools

indeterminate 關鍵字(表示一個 indeterminate不確定 tribool 的值)也被用作一個函數,用於檢查一個 tribool 值是否為"不確定":

tribool x = try_to_do_something_tricky();
if (indeterminate(x)) {
// value of x is indeterminate
}
else {
// report success or failure of x
}

Renaming the indeterminate state為"不確定"狀態更名

除了實現為提供的indeterminate以外,用戶可以引入其它的關鍵字來表示"不確定"值,方法是使用 BOOST_TRIBOOL_THIRD_STATE 宏。例如,以下寫法(須在全局範圍)將引入一個關鍵字 maybe 作為 indeterminate (同樣位於 boost 命名空間)的同義詞:

BOOST_TRIBOOL_THIRD_STATE(maybe)
tribool x = maybe;
if (maybe(x)) { /* ... */ }

tribool input/output輸入/輸出

tribool 對象可以從流中讀入,也可以寫出到流,只需包含頭文件 boost/logic/tribool_io.hpp,輸入/輸出的風格類似於 bool 值。如果 boolalpha 標誌未被設置在輸入/輸出流中,則整型值 0, 1, 和 2 分別對應於 triboolfalse, true, 和 indeterminate。如果 boolalpha 被設置,則可以為這三個值設定任意的字符串來表示,省缺的是 "false", "true", 和 "indeterminate"。例如:

tribool x;
cin >> x; // Type "0", "1", or "2" to get false, true, or indeterminate
cout << boolalpha << x; // Produces "false", "true", or "indeterminate"

tribool 的輸入/輸出與流的當前locale相關。false和true值所對應的字符串包含於標準的 std::numpunct facet中,而 indeterminate 對應的字符串則包含於 indeterminate_name facet中。要替換 indeterminate 狀態的字符串,你需要將一個local注入你所使用的流,該local需包含一個 indeterminate_name facet,如:

BOOST_TRIBOOL_THIRD_STATE(maybe)
locale global;
locale test_locale(global, new indeterminate_name<char>("maybe"));
cout.imbue(test_locale);
tribool x(maybe);
cout << boolalpha << x << endl; // Prints "maybe"

如果你的C++標準庫實現不支持 locales, tribool 的輸入/輸出也可以工作,但是你就不能定制在設置boolalpha時所打印或解釋的字符串了。

Copyright © 2002-2004 Douglas Gregor

PrevUpHomeNext