【发布时间】:2015-05-31 11:42:57
【问题描述】:
我的目标是输出多个流。您可以在下面看到工作代码。
我正在尝试使用可变参数模板,但失败了。下一个代码如何“变化”?
有几个非常相似的变量,所以我猜它可以使用可变参数模板重写,但我不知道如何。
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!";
}
感谢您的尝试!
附言我知道存在 boost::tee,但我的问题略有不同,可以在这里阅读:How to declare an "implicit conversion" in a variadic template?
【问题讨论】:
-
为什么你认为你需要一个可变参数模板来解决这个问题?我看不出采用这种方法的理由。
-
stringstreams 和ofstreams 也是ostreams。为什么需要几个不同的vector<IsOn<..>>? -
dyp,谢谢。出于学习目的,我想问:是否有一种常见且简单的方法来创建像“tmy”这样的结构,其中包含不同类型的可变数量的字段?
-
是的,创建这种结构的一种常见且简单的方法是
std::tuple。
标签: c++ stream variadic-templates variadic