我在努力實現什麼?如何找出輸出流鏈是否結束?
如何才能找到流鏈是否結束?看看下面的功能(所有這些功能都是LogRouter類中在這個問題):
template<typename First, typename... Rest>
void log(const LogLevel &level_, First first_, Rest... rest_) {
sstream << first_ << " ";
log(level_, rest_...);
}
void log(const LogLevel &level_) {
for(auto &route : routes)
route->stream() << sstream.str() << std::endl;
sstream.clear();
sstream.str("");
}
我想實現在上面,但使用流完全相同的功能。所以,當我到達流的末尾,它需要的最終數據發送到路線和,而不是使用
router.log(LogLevel::Alert, "test stream", 15);
我希望能夠使用
router.log(LogLevel::Alert) << "test stream " << 15;
我曾嘗試:
std::ostream
運算符重載不接受打包的變量。逐一通過每一個傳遞的值。如下圖所示:
struct LogEnd {}; static LogEnd end() { return LogEnd; } template<typename T> LogRouter &operator<<(const T &value) { sstream << value; return *this; } LogRouter &log(const LogLevel &level_) { currentLogLevel = level_; //had to add another variable return *this; } void operator<<(const LogEnd &end) { for(auto &route : routes) route.stream() << sstream.str() << std::endl; currentLogLevel = LogLevel::None; }
這給了我什麼,我想語法明智的,但我需要調用額外的
LogRouter::end()
在每個月底:router.log(LogLevel::Alert) << "test stream " << 15 << LogRouter::end();
我有一個語法
std::endl
還,但它會最好的,如果我可以在最後沒有任何東西的情況下調用它
問題
有沒有知道流鏈末端的一種方式。類似於使用遞歸可變參數模板函數時可以執行的操作。
你可以請澄清你爲什麼要派生一個私人虛擬'std :: stringbuf' – Gasim
這是一個可愛的,緊湊的解決方案,但你如何編譯它?我正在嘗試使用g ++ 4.8,並且遇到很多錯誤。 – Bogatyr
@Bogatyr:首先,你需要使用C++ 11編譯('-std = C++ 11')來獲得支持的右值引用。您還需要有一個標準庫,可以正確支持流的移動構建。通過這些,代碼按原樣編譯。我不知道用'g ++'4.8發佈'libstdC++'是否正確實現了。如果流的構建沒有得到很好的支持,你可能需要將'std :: stringbuf'粘貼到'std :: unique_ptr'中,並移動指針而不是'std :: stringbuf' 。 –