2009-03-22 13 views
7

क्या कोई मेरी मदद कर सकता है?बूस्ट :: iostreams :: tee_device का उपयोग करना?

मैं की तरह कुछ करने के लिए कोशिश कर रहा हूँ निम्नलिखित:

#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()); 

लेकिन यह 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 

किसी को भी इस काम करने के लिए मिल गया है? मुझे पता है कि मैं इसे करने के लिए अपनी खुद की कक्षा बना सकता हूं, लेकिन मैं जानना चाहता हूं कि मैं क्या गलत कर रहा हूं।

धन्यवाद

उत्तर

10

आप जो एक टी-स्ट्रीम खुद का निर्माण और है कि करने के लिए सभी तर्कों को आगे io::stream की constructor-forwarding version का उपयोग करें। सी ++ 03 में केवल सीमित क्षमताएं होती हैं जब कार्यों में तर्कों को अग्रेषित करने की बात आती है (अत्यधिक अधिभार की मात्रा को आसानी से बढ़ने की आवश्यकता होती है)। यह (io::stream) निम्न प्रतिबंध बनाता है:

इन सदस्यों में से

प्रत्येक धारा का एक उदाहरण का निर्माण और डिवाइस टी तर्कों की दी सूची से निर्माण का एक उदाहरण के साथ इसे संबद्ध करता है। शामिल टी रचनाकारों को मूल्य या कॉन्स्ट संदर्भ द्वारा सभी तर्क लेना चाहिए।

ठीक है, लेकिन tee_device निर्माता का कहना है

सिंक के दिए गए जोड़ी के आधार पर tee_device का एक उदाहरण निर्माण करती है। प्रत्येक फ़ंक्शन पैरामीटर एक गैर-कॉन्स्ट संदर्भ है यदि संबंधित टेम्पलेट तर्क एक स्ट्रीम या स्ट्रीम बफर प्रकार है, और अन्यथा एक कॉन्स्ट संदर्भ है।

यह निश्चित रूप से काम नहीं करेगा। io::stream एक अन्य निर्माता प्रदान करता है जो पहले तर्क के रूप में T लेता है। यह यहां काम करता है (।। संकलन, कम से कम जोर विफल रहता है, हालांकि मैं boost::iostreams के साथ काम किया नहीं गया है तो मैं उस के साथ मदद नहीं कर सकता)

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()); 

संपादित करें: flush() बुला या << std::flush स्ट्रीमिंग के बाद, जोर से गुजरता है ।

+0

वाह ... दस्तावेज में यह नहीं देखा। बहुत बढ़िया काम, बहुत बहुत धन्यवाद! – rlbond

2

शायद आप इस तरह इसे सेट अप की जरूरत है:

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); 
संबंधित मुद्दे