Tôi không biết nếu những gì tôi đang viết có ý nghĩa nhưng tôi nhớ tôi nhìn thấy một hàm ivoked như thế này:là nó có thể vượt qua stringstream như là một tham số chức năng?
my_func(ss << "text" << hex << 33);
Có thể?
Tôi không biết nếu những gì tôi đang viết có ý nghĩa nhưng tôi nhớ tôi nhìn thấy một hàm ivoked như thế này:là nó có thể vượt qua stringstream như là một tham số chức năng?
my_func(ss << "text" << hex << 33);
Có thể?
Điều chắc chắn. Tại sao nó sẽ không được? Khai báo ví dụ về chức năng như vậy:
void my_func(std::ostringstream& ss);
cảm ơn bạn, rằng những gì tôi bỏ qua, tôi biết nó là hơi có thể nhưng tôi không biết tuyên bố sử dụng để đạt được hiệu ứng đó – rsk82
Ngoại trừ loại 'ss <<" test "<< hex << 33' không 'std :: stringstream &', nhưng 'std :: ostream &', và nó sẽ không khớp với chữ ký đã cho. –
@James Kanze Đó là tất nhiên chính xác. –
Tuyệt đối! Hãy chắc chắn rằng bạn vượt qua nó bằng cách tham chiếu, không phải bởi giá trị.
void my_func(ostream& stream) {
stream << "Hello!";
}
Có nó là, và
Function(expresion)
sẽ làm cho biểu thức được đánh giá đầu tiên và kết quả của nó sẽ được thông qua như một tham số
Lưu ý: Operator << for ostreams trả về một ostream
my_func
phải có chữ ký dọc theo các dòng:
void my_func(std::ostream& s);
, vì đó là loại ss << "text" << hex << 33
. Nếu mục tiêu là để trích xuất chuỗi được tạo, you'ld phải làm điều gì đó như:
void
my_func(std::ostream& s)
{
std::string data = dynamic_cast<std::ostringstream&>(s).str();
// ...
}
Lưu ý rằng bạn không thể sử dụng luồng tạm thời;
my_func(std::ostringstream() << "text" << hex << 33);
sẽ không biên dịch (ngoại trừ có thể với VC++), vì nó không hợp pháp C++. Bạn có thể viết một cái gì đó như:
my_func(std::ostringstream().flush() << "text" << hex << 33);
nếu bạn muốn sử dụng tạm thời. Nhưng đó không phải là rất thân thiện với người dùng.
Không phải là khó để thử nó? – aztaroth