2009-05-21 27 views
14

Tôi đã mã sau:Làm cách nào để tạo chuỗi std :: từ DWORD?

Tools::Logger.Log(string(GetLastError()), Error); 

GetLastError() trả về một DWORD một giá trị số, nhưng các nhà xây dựng của std::string không chấp nhận một DWORD.

Tôi có thể làm gì?

+0

(Đã chuyển từ phi câu trả lời) đọc [Các Định dạng String của Manor Farm] (http://www.gotw.ca/publications/mill19.htm) bởi Herb Sutter. Đó là một so sánh tuyệt vời của các cách khác nhau để chuyển đổi dữ liệu thành chuỗi, bao gồm std :: stringstream, Boost :: lexical_cast, sprintf, snprintf và std :: strstream. –

Trả lời

33

Bạn muốn đọc lên trên ostringstream:

#include <sstream> 
#include <string> 

int main() 
{ 
    std::ostringstream stream; 
    int i = 5; 
    stream << i; 
    std::string str = stream.str(); 
} 
+1

điều đó buồn cười ... ai sẽ downvote điều này? Tôi sẽ không nghĩ rằng điều này sẽ gây tranh cãi :) –

+2

Nếu bạn quên #include bạn sẽ nhận được một thông báo lỗi lạ: "lỗi: tổng hợp‘ std :: ostringstream ... ’có loại không đầy đủ và không thể xác định được". Sửa chữa đơn giản. –

+1

Hầu hết các câu trả lời đều có chính xác một câu trả lời. Nó có thể là ai đó downvoted mỗi câu trả lời nhưng riêng của họ? Thật không may có nhiều hơn một nghi ngờ :) –

9

Sử dụng Boost của lexical_cast đối với trường hợp đơn giản như trên:

Tools::Logger.Log(lexical_cast<string>(GetLastError()), Error); 
22

Bạn muốn chuyển đổi số để một string:

std::ostringstream os; 
os << GetLastError(); 
Log(os.str(), Error); 

Hoặc boost::lexical_cast:

Log(boost::lexical_cast<std::string>(GetLastError()), Error); 
0

gì tôi thường làm là:

std::ostringstream oss; 
oss << GetLastError() << " :: " << Error << std::endl; 
Tools::Logger.Log(oss.str()); // or whatever interface is for logging 
1

Sử dụng std :: stringstream.

std::stringstream errorStream; 
errorStream << GetLastError(); 
Tools::Logger.Log(errorStream.str(), Error); 
0

Như mọi người ở đây đã đề xuất, triển khai sẽ sử dụng chuỗi.
Trong dự án hiện tại của tôi, chúng tôi tạo ra chức năng

template <typename T> 
std::string util::str::build(const T& value); 

để tạo ra chuỗi từ bất cứ nguồn nào.

Vì vậy, trong dự án của chúng tôi nó sẽ là

Tools::Logger.Log(util::str::build(GetLastError())); 

sử dụng như vậy của con suối trong cách gợi ý sẽ không vượt qua xét của tôi trừ khi ai đó quấn nó.

+0

tăng :: lexical_cast đã làm điều này ... – rlbond

+0

Bạn có thích nó trông như thế nào? Bạn có thể chỉ định nó cho công việc với đôi. Đối với công việc với loại của riêng bạn mà không thể sử dụng với luồng? –

2

Bạn có thể sử dụng STLSoft 's winstl::int_to_string(), như sau:

Tools::Logger.Log(winstl::int_to_string(GetLastError()), Error); 

Ngoài ra, nếu bạn muốn để tra cứu các hình thức chuỗi các mã lỗi, bạn có thể sử dụng STLSoft của winstl::error_desc.

Có một loạt bài viết trong Dr Dobb's về điều này một vài năm trước: các bộ phận one, two, three, four. Đi vào chủ đề trong các chi tiết tuyệt vời, đặc biệt là về hiệu suất.

8

Kể từ C++ 11

std::to_string() với quá tải cho int, long, long long, unsigned int, unsigned long, unsigned long long, float, doublelong double.

auto i = 1337; 
auto si = std::to_string(i); // "1337" 
auto f = .1234f; 
auto sf = std::to_string(f); // "0.123400" 

Vâng, tôi là người hâm mộ của auto.

Để sử dụng ví dụ của bạn:

Tools::Logger.Log(std::to_string(GetLastError()), Error); 
+0

Đẹp! Cảm ơn bạn đã dạy tôi về tự động của C++. Tôi giả sử nó là C++ tương đương với 'var' mà C# có? –

+1

Có, xem [trang tôi đã tham chiếu] (http://en.cppreference.com/w/cpp/language/auto). Tôi không có chuyên gia C# nên có thể có sự khác biệt nhỏ. –

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