2014-02-19 28 views

回答

0

的答案在這裏是挑釁性的,但他們不給我我想要的樣子。我最終做了一個函數宏,例如:

#define SHOW_ERROR(e) { stringstream ss; ss << e; show_error(ss.str()); } 
void show_error(string message) 
{ 
//show error here 
} 
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); 
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); 
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(); 
} 
相關問題