2014-12-10 13 views
5

này hoạt động:Có thể sử dụng đối tượng chuỗi tuần tự tạm thời không?

stringstream temp; 
temp << i; 
result_stream << transform(temp.str()); 

(transform là một chức năng mà phải mất một string và trả về một string; i là một int). Tuy nhiên, nỗ lực của tôi để cho C++ 11 tạo ra một đối tượng tạm thời mà không có một tên đã không làm việc:

result_stream << transform((stringstream() << i).str()); 

Tôi nghĩ rằng nó sẽ làm việc, kể từ thứ hai << chỉ nên trả lại số đầu tiên và tôi muốn được có thể sử dụng str() trên đó. Nhưng tôi nhận được lỗi này:

error: 'class std::basic_ostream<char>' has no member named 'str' 

Tôi đang sử dụng g ++ 4.8.1 (MinGW-W64).

Có cách nào để thực hiện điều này (ví dụ: viết mã như thế này bằng cách sử dụng tên tạm thời chưa được đặt tên)? (Đoạn mã trên là một chút đơn giản, và mã thực tế liên quan đến việc sử dụng << trên lập luận khác hơn int.)

+0

Đối với tác vụ này, tôi cân nhắc tạo một hàm chuyển đổi int thành chuỗi, đặc biệt nếu g ++/MinGW-64 vẫn không hỗ trợ std :: to_string –

+0

có thể trùng lặp của [Sử dụng chuỗi ẩn danh để tạo chuỗi] http://stackoverflow.com/questions/19665458/use-an-anonymous-stringstream-to-construct-a-string) –

Trả lời

6

này không làm việc vì thứ hai <<std::ostream &operator<<(std::ostream &, int); và do đó kiểu trả về là ostream& mà không có thành viên str().

Bạn sẽ phải viết:

result_stream << transform(static_cast<stringstream &>(stringstream() << i).str()); 
+0

Cảm ơn, điều đó hoạt động. Nhưng nó bắt đầu nhìn một chút lông, và nó không hoạt động khi 'i' được thay thế bởi một biểu hiện của lớp riêng của tôi, mà tôi đã định nghĩa một toán tử' bạn bè << '. Vì vậy, tôi có lẽ sẽ không theo đuổi điều này nữa. – ajb

6

Kết quả của các nhà điều hành << trên tạm thời stringstream là một ostream. Không có phương thức str() trên số ostream.

Sử dụng to_string thay vì:

result_stream << transform(std::to_string(i)); 
4

operator<<() trả về một tham chiếu đến lớp cơ sở std::ostream chứa trong std::stringstream. Lớp cơ sở không chứa phương thức str(). Bạn có thể bỏ nó trở lại xuống đến một std::stringstream&:

result_stream << transform(static_cast<std::stringstream&>(std::stringstream() << i).str()); 
3

Cố gắng và thất bại trong việc làm điều này cho C++ 11 (năm 2009):

http://cplusplus.github.io/LWG/lwg-active.html#1203

libC++ đã cấm và thực hiện nó anyway.

Điều này là để xem xét lại, nhưng không thể chuẩn hóa trước năm 2017 (tiêu chuẩn hóa là quy trình băng hà).

+0

Rất hữu ích, cảm ơn! – ajb

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