2012-11-28 81 views
5

Làm cách nào để viết hoa đầu ra được tạo ra bởi các giá trị boolean.boolalpha viết hoa

Tôi biết rằng nếu tôi đã làm:

cout << boolalpha << true;

nó sẽ ra

true

làm thế nào để làm cho nó ra

True

Tôi có một số cảm giác nó đã làm với do_truename và do_falsename, nhưng tôi không có đầu mối làm thế nào để làm điều đó.

+2

Bạn đã bao giờ nghĩ đến việc chỉ làm một cái gì đó như 'cout << (true "True": "Sai") '? –

+0

Bạn cần phải nói mức độ thường xuyên bạn sẽ sử dụng những thứ như vậy. Nếu bạn cần một lần - hãy sử dụng lời khuyên từ Kevin Ballard hoặc cố gắng hiểu hệ thống C++ Facet http://stdcxx.apache.org/doc/stdlibug/25-5.html http://msdn.microsoft.com/ en-us/library/0z120te3.aspx http://www.cplusplus.com/reference/locale/numpunct/truename/ –

+0

vâng, nhưng tôi không muốn làm điều đó ở mọi nơi tôi có boolean, đôi khi tôi muốn 'cout << function (" foo ");' trong đó hàm trả về một boolean, và tôi không có ý tưởng trước thời gian mà hàm quá tải sẽ được sử dụng. – Gideon

Trả lời

6

Đối với một khoảnh khắc thoáng qua, tôi nghĩ rằng điều này có thể được thực hiện bằng cách sử dụng std::uppercase nhưng điều này dường như không xảy ra: chỉ áp dụng cho những thứ như số thập lục phân và số mũ. Vì vậy, có vẻ như nó, trên thực tế, đòi hỏi một sự ghi đè std::numpunct<char> đó là, tuy nhiên, không phải là xấu?

#include <iostream> 
#include <locale> 

struct numpunct 
    : std::numpunct<char> 
{ 
    std::string do_truename() const { return "True"; } 
    std::string do_falsename() const { return "False"; } 
}; 

int main() 
{ 
    std::locale loc(std::cout.getloc(), new numpunct); 
    std::cout.imbue(loc); 
    std::cout << std::boolalpha << true << "\n"; 
} 
+1

Câu hỏi: Điều gì sẽ xảy ra với đối tượng được tạo trong' numpunct' mới? Nó sẽ được de-phân bổ sau đó các đối tượng địa phương mới đi ra khỏi phạm vi? – jogojapan

+0

Cảm ơn! Điều đó đã làm các trick. – Gideon

+4

@jogojapan: Tôi đang cố đăng mã hoạt động chính xác. Vì vậy, có, đối tượng là tham chiếu ngầm định tính và nó sẽ bị phá hủy khi 'std :: locale' cuối cùng tham chiếu nó đi ngoài phạm vi. Vì việc duy trì các đối tượng 'std :: locale' hơi tiềm ẩn và chúng kết thúc ở một vài nơi, nên cảm giác rằng đối tượng cần được tự động duy trì. Vì không có 'std :: shared_ptr ' xung quanh, nó sử dụng lược đồ đếm tham chiếu tùy chỉnh. –

Các vấn đề liên quan