2009-03-22 17 views
7

Ai đó có thể giúp tôi không?Sử dụng tăng :: iostreams :: tee_device?

Tôi cố gắng để làm một cái gì đó như sau:

#include <boost/iostreams/tee.hpp> 
#include <boost/iostreams/stream.hpp> 
#include <sstream> 
#include <cassert> 

namespace io = boost::iostreams; 
typedef io::stream<io::tee_device<std::stringstream, std::stringstream> > Tee; 
std::stringstream ss1, ss2; 
Tee my_split(ss1, ss2); // redirects to both streams 
my_split << "Testing"; 
assert(ss1.str() == "Testing" && ss1.str() == ss2.str()); 

Nhưng nó sẽ không biên dịch trong VC9:

c:\lib\boost_current_version\boost\iostreams\stream.hpp(131) : error C2665: 'boost::iostreams::tee_device<Sink1,Sink2>::tee_device' : none of the 2 overloads could convert all the argument types 

Có ai nhận này để làm việc? Tôi biết tôi có thể làm cho lớp học của riêng tôi để làm điều đó, nhưng tôi muốn biết những gì tôi đang làm sai.

Cảm ơn

Trả lời

10

Bạn sử dụng constructor-forwarding version của io::stream, mà xây dựng một tee-stream chính nó và chuyển tiếp tất cả các đối số cho rằng. C++ 03 chỉ có các khả năng giới hạn khi nói đến việc chuyển tiếp các đối số tới các hàm (lượng quá tải cần thiết dễ dàng tăng theo cấp số nhân). Nó (io::stream) làm cho các hạn chế sau:

Mỗi thành viên xây dựng một thể hiện của dòng và liên kết nó với một thể hiện của T Device xây dựng từ danh sách cho các đối số. Các nhà thầu T tham gia phải lấy tất cả các đối số theo giá trị hoặc tham chiếu const.

Vâng, nhưng các nhà xây dựng tee_device nói

Tạo thời thể hiện của tee_device dựa trên cặp nhất định Sinks. Mỗi tham số hàm là một tham chiếu không-const nếu đối số mẫu tương ứng là một loại luồng hoặc luồng đệm và tham chiếu const khác.

Điều đó sẽ không hoạt động, tất nhiên. io::stream cung cấp một hàm tạo khác có tham số T làm đối số đầu tiên. Này hoạt động ở đây (.. Biên dịch, ít nhất Khẳng định thất bại, mặc dù tôi đã không làm việc với boost::iostreams vì vậy tôi không thể giúp đỡ với điều đó)

namespace io = boost::iostreams; 
typedef io::tee_device<std::stringstream, std::stringstream> TeeDevice; 
typedef io::stream<TeeDevice> TeeStream; 
std::stringstream ss1, ss2; 
TeeDevice my_tee(ss1, ss2); 
TeeStream my_split(my_tee); 
my_split << "Testing"; 
assert(ss1.str() == "Testing" && ss1.str() == ss2.str()); 

Edit: Sau khi gọi flush() hoặc streaming << std::flush, sự khẳng định qua .

+0

Chà ... không thấy điều đó trong tài liệu. Công việc tuyệt vời, cảm ơn rất nhiều! – rlbond

2

Có lẽ bạn cần phải thiết lập nó như thế này:

typedef io::tee_device<std::stringstream, std::stringstream> Tee; 
typedef io::stream<Tee> TeeStream; 

std::stringstream ss1, ss2; 
Tee my_tee(ss1, ss2); 
TeeStream my_split(my_tee); 
Các vấn đề liên quan