0

Моя цель - отправить данные нескольким потокам. Это возможно, используя boost :: tee. Но я хочу написать обертку с вариационным шаблоном для использования нескольких потоков.Как объявить «неявное преобразование» в вариационном шаблоне?

Проблема в том, что мне требуется неявное преобразование из структуры потомка в структуру предка. Или что-то типа того.

#include <boost/iostreams/tee.hpp> 
#include <boost/iostreams/stream.hpp> 
#include <fstream> 
#include <iostream> 
using namespace std; 
namespace bio = boost::iostreams; 
using bio::tee_device; 
using bio::stream; 

template<typename ... Ts> 
struct pu; 

template<typename T1,typename T2> 
struct pu<T1,T2>:public stream<tee_device<T1,T2>> 
{ 
typedef stream<tee_device<T1,T2>> base_type; 
operator base_type() { return static_cast<base_type&>(*this); } 
base_type& base = static_cast<base_type&>(*this); 
pu(T1& t1, T2& t2): base_type(tee_device<T1,T2>(t1,t2)) {} 
}; 

template<typename T1,typename T2,typename T3,typename ... Ts> 
struct pu<T1,T2,T3,Ts...> : public stream<tee_device<T1,pu<T2, T3, Ts ...>>> 
{ 
typedef stream<tee_device<T1,pu<T2, T3, Ts ...>>> base_type; 
operator base_type() { return static_cast<base_type&>(*this); } 
pu(T1& t1, T2& t2, T3& t3, Ts& ... ts) : base_type(t2,t3,ts...){} 
}; 

int main() 
{ 
pu<ostream,ostream> hT(cout,cout); hT<<"2"; 
pu<ostream,ostream,ostream> hR(cout,cout,cout); hR<<"3"; 
return 0; 
} 

Ошибка

..\boost_1_56_0\boost\iostreams\detail\forward.hpp|73|error: no matching function for call to 
'boost::iostreams::tee_device<std::basic_ostream<char>, pu<std::basic_ostream<char, std::char_traits<char> >, std::basic_ostream<char, std::char_traits<char> > > >::tee_device(std::basic_ostream<char>&, const std::basic_ostream<char>&)'| 

Ожидаемый выход "22333". (У меня есть «22», но не имеют «333». Т.е. это хорошо работать без второй линии основной)

Другими словами, мне нужно преобразование из

template<typename T1,typename T2,typename T3,typename ... Ts> 

к

stream<tee_device<T1,pu<T2, T3, Ts ...>>> 

внутри шаблона.

Спасибо!

p.s. (Это мой первый пост) & & (я не родной динамик)

ответ

1

У вас уже есть преобразование, что вы просите, потому что типы классов уже неявно конвертируются в своих публичных базовых типов, но это не то, что вам нужно для устранения ошибки.

Аргументы base_type конструктора в VARIADIC специализации tu ошибаетесь:

pu(T1& t1, T2& t2, T3& t3, Ts&... ts) : base_type(t2, t3, ts...) {} 

Вы могли бы попробовать это вместо:

pu(T1& t1, T2& t2, T3& t3, Ts&... ts) : base_type(t1, pu<T2, T3, Ts...>(t2, t3, ts...)) {} 

Но это не будет работать, потому что, в соответствии с documentation, если аргументы для конструктора tee_device являются потоками, тогда они должны связываться со ссылками на неконстантные, поэтому они должны быть lvalues. Первый аргумент t1 соответствует этому критерию, но второй аргумент - временный pu - нет.

Следующее решение использует множественное наследование для синтеза именующего выражения pu:

template <typename T> 
struct hold 
{ 
    T held; 
    template <typename... Ts> hold(Ts&&... vs) : held(std::forward<Ts>(vs)...) {} 
}; 

template<typename...> 
struct pu; 

template<typename T1, typename T2> 
struct pu<T1, T2> : public stream<tee_device<T1, T2>> 
{ 
    typedef stream<tee_device<T1, T2>> base_type; 
    pu(T1& t1, T2& t2): base_type(tee_device<T1, T2>(t1, t2)) {} 
}; 

template<typename T1, typename T2, typename T3, typename... Ts> 
struct pu<T1, T2, T3, Ts...> : private hold<pu<T2, T3, Ts...>> 
          , public stream<tee_device<T1, pu<T2, T3, Ts...>>> 
{ 
    typedef stream<tee_device<T1, pu<T2, T3, Ts...>>> base_type; 
    pu(T1& t1, T2& t2, T3& t3, Ts&... ts) : hold<pu<T2, T3, Ts...>>(t2, t3, ts...) 
              , base_type(t1, this->held) {} 
}; 
+0

Thanx, но у меня абсолютно такой же проблема с ним. ** \ boost \ iostreams \ detail \ forward.hpp | 73 | ошибка: нет подходящей функции для вызова boost: iostreams :: tee_device , pu >, std :: basic_ostream >>> :: tee_device (std :: basic_ostream &, const pu >, std :: basic_ostream >> &) '| ** – ged

+0

@GeorgeDunaev Отредактировано. – Oktalist