最初のパラメーター型でオーバーロードしたい可変個引数関数があります。
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
が、解決策は私が上に示した単純なコードよりもはるかに大きかったです)。