باستخدام دفعة :: :: iostreams tee_device؟
-
21-08-2019 - |
سؤال
ويمكن للشخص مساعدتي؟
وأنا أحاول أن تفعل شيئا مثل ما يلي:
#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
وقد أي شخص حصلت على هذا العمل؟ وأنا أعلم أنني يمكن أن تجعل الطبقة بلدي للقيام بذلك، ولكن أريد أن أعرف ما أقوم به خطأ.
والشكر
المحلول
واستخدام منشئ إعادة توجيه نسخة من io::stream
، والتي بناء نقطة الإنطلاق تيار نفسها وتوجيه كافة الحجج على ذلك. C ++ 03 وقدرات محدودة فقط عندما يتعلق الأمر إعادة توجيه الحجج على وظائف (كمية الزائدة اللازمة تنمو بسهولة أضعافا مضاعفة). عليه (io::stream
) يجعل القيود التالية:
وكل من هؤلاء الأعضاء يبني مثيل تيار بل يربطها مع مثيل جهاز T شيدت من قوائم معينة من الحجج. والصانعين T المعنية أن تتخذ جميع الحجج من حيث القيمة أو إشارة CONST. م>
اقتباس فقرة> حسنا، ولكن المنشئ tee_device
يقول
ويبني مثيل tee_device بناء على زوج معين من المصارف. كل معلمة وظيفة هي إشارة غير CONST إذا كانت الوسيطة قالب المقابلة هو نوع تيار أو تيار العازلة، وإشارة CONST خلاف ذلك.
اقتباس فقرة> وهذا لن تعمل، بطبيعة الحال. يوفر 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
، يمر التأكيد.
نصائح أخرى
وربما تحتاج إلى إعداده مثل هذا:
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);