我有一个可变参数函数,我想在第一个参数类型上重载。
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
但解决方案比我上面显示的简单代码大得多)。