在我的代码中,我有很多东西,比如
message << a << "hi" << b;
show_error(message.str())
有没有办法让它像function(a << "hi" << b);
答案 0 :(得分:2)
这是使用可变参数模板的一个小技巧。它允许您编写如下代码:
show_error(format(5, "-hi-", 3.4));
show_error(format("wow: ", std::string("test"), 25, 2.1));
format
函数如下所示:
template<class... T>
std::string format(T... args)
{
std::stringstream ss;
int dummy[sizeof...(T)] = { (ss << args, 0)... };
return ss.str();
}
答案 1 :(得分:1)
是的,你可以在一行中完成,如下所示:
show_error(((stringstream&)(message << a << " hi " << b)).str());
运算符<<
返回调用它的流,因此这应该是可能的。这是demo on ideone。
您可以通过将show_error
更改为ostream
,将其转换为stringstream&
并从中获取字符串来改进此方法:
show_error(const string& s); // Your original function
show_error(ostream& oss) { // Your new overload
show_error(((stringstream&)oss).str());
}
现在你可以这样写:
show_error(message << a << "hi" << b);
答案 2 :(得分:0)
class mystringstream {
std::stringstream _stream;
public:
template<class T>
mystringstream &operator <<(const T &v) { _stream << v; return *this; }
operator std::string() const { return _stream.str(); }
};
function(mystringstream() << a << "hi" << b);
答案 3 :(得分:0)
这里的答案具有挑衅性,但它们并没有给我我想要的外观。我最终做了一个函数宏,例如:
#define SHOW_ERROR(e) { stringstream ss; ss << e; show_error(ss.str()); }
void show_error(string message)
{
//show error here
}