Моя цель состоит в том, чтобы выпустить несколько потоков. Вы можете увидеть рабочий код ниже.Пример шаблона Variadic для простой структуры
Я пытаюсь использовать вариативные шаблоны, но мне не удалось. Как следующий код может быть «изменен»?
Существует несколько очень похожих переменных, поэтому я предполагаю, что их можно переписать с использованием вариативных шаблонов, но я не знаю, как это сделать.
template<typename T>
struct IsOn
{
T *pt;
bool isOn;
IsOn(T& t, bool b):pt(&t),isOn(b) {}
};
struct tmy
{
vector<IsOn<ostream>> v0;
vector<IsOn<ofstream>> v1;
vector<IsOn<stringstream>> v2;
};
template<typename T>
tmy& operator<<(tmy& rt,T& t) {
int len;
len=rt.v0.size();
for(int i=0; i<len;++i) if(rt.v0[i].isOn) (*rt.v0[i].pt)<<t;
len=rt.v1.size();
for(int i=0; i<len;++i) if(rt.v1[i].isOn) (*rt.v1[i].pt)<<t;
len=rt.v2.size();
for(int i=0; i<len;++i) if(rt.v2[i].isOn) (*rt.v2[i].pt)<<t;
return rt;
}
int main(int argc, char** argv) {
tmy my;
my.v0.push_back(IsOn<ostream>(cout, true));
my.v0.push_back(IsOn<ostream>(cerr, false));
my.v0.push_back(IsOn<ostream>(clog, true));
my<<"hi twice!";
}
Спасибо за внимание!
p.s. Я знаю, что существует boost :: tee, но у меня есть немного другая проблема, которую можно прочитать здесь: How to declare an "implicit conversion" in a variadic template?
Почему вы думаете, что нужно varadic шаблон для решения этой проблемы? Я не вижу причины такого подхода. –
'stringstream' и 'ofstream' также являются 'ostream'. Зачем вам нужно несколько разных 'vector>'? –
dyp
dyp, спасибо. В целях изучения я хочу спросить: существует ли простой и простой способ создания структуры типа «tmy» с переменным количеством полей с другим типом? – ged