첫 번째 매개 변수 유형에서 오버로드하려는 variadic 함수가 있습니다.가변 템플릿 함수 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
으로 해결할 수 있었지만, 솔루션은 위에 표시된 간단한 코드보다 훨씬 컸다.)
왜 마지막 템플릿 전문화가 필요합니까? 문제는 그 문제없이 사라질 것입니다. –
@Diego, 마지막 전문화 ('write (args)')는 호출자가 ostream 객체를 제공하지 않은 경우 첫 번째 인수로'std :: cout'을 넣습니다. –