在我的代碼我有很多東西像C++流作爲函數參數。我可以做一些像功能(a <<「hi」<< b);
message << a << "hi" << b;
show_error(message.str())
有沒有一種方法,使之成爲一個襯墊像function(a << "hi" << b);
在我的代碼我有很多東西像C++流作爲函數參數。我可以做一些像功能(a <<「hi」<< b);
message << a << "hi" << b;
show_error(message.str())
有沒有一種方法,使之成爲一個襯墊像function(a << "hi" << b);
的答案在這裏是挑釁性的,但他們不給我我想要的樣子。我最終做了一個函數宏,例如:
#define SHOW_ERROR(e) { stringstream ss; ss << e; show_error(ss.str()); }
void show_error(string message)
{
//show error here
}
是的,你可以做到這一點的一條線,像這樣:
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);
是的,像這樣的班級應該這樣做:
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);
這是一個使用可變參數模板的小技巧。它可以讓你喜歡寫代碼:
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();
}
「message」的類型是什麼? – sgarizvi