我有一个可变参数函数,我想在第一个参数类型上重载。在可变参数模板函数中的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