我有一個可變參數函數,我想在第一個參數類型上重載。在可變參數模板函數中的ostream上重載
void write(void) { }
void write(std::ostream&) { }
template< typename Head, typename... Rest >
void write(std::ostream& out, Head&& head, Rest&&... rest)
{
out << head;
write(out, std::forward<Rest>(rest)...);
}
template< typename... Args >
void write(Args&&... args)
{
write(std::cout, std::forward<Args>(args)...);
}
但是這些函數並不像預期的那樣工作。
write("## to cout ##"); // printed to stdout as expected
write(std::cerr, "## to cerr ##"); // printed to stderr as expected
std::ostringstream oss;
write(oss, "## to string ##"); // error here
// '0x7fff9db8## to string ##' is printed to stdout!
這是怎麼回事?
爲什麼重載分辨率選擇我想要的功能?
有沒有辦法做到這一點,沒有大量的元編程? (我可以用std::is_convertible
解決這個問題,但是解決方案比我上面顯示的簡單代碼大得多)。
爲什麼你需要最後一個模板專業化?如果沒有那個問題,問題就會消失。 – 2011-05-13 20:36:22
@Diego,如果ostream對象不是由調用者提供的,最後一個專門化('write(args)')將'std :: cout'放置爲第一個參數。 – 2011-05-13 20:41:06