가변 인자 템플릿 printf 함수의 구현이 몇 가지 있습니다. 사방가변 인자 템플릿과 typesafety
void printf(const char* s) {
while (*s) {
if (*s == '%' && *++s != '%')
throw std::runtime_error("invalid format string: missing arguments");
std::cout << *s++;
}
}
template<typename T, typename... Args>
void printf(const char* s, const T& value, const Args&... args) {
while (*s) {
if (*s == '%' && *++s != '%') {
std::cout << value;
return printf(++s, args...);
}
std::cout << *s++;
}
throw std::runtime_error("extra arguments provided to printf");
}
와이 구현은 입력 안전 (가변 인수가 va_arg를 포함) 정상적인 C가되지 않은 상태입니다 있다고한다 : 하나는 이것이다.
왜 그럴까요? 타입 안전성이란 무엇을 의미하며 C printf va_arg보다이 구현이 갖는 이점은 무엇입니까?
이 버전은 형식 플래그에 전혀 신경 쓰지 않고 단지 스트림 운영자를 통해 물건을 인쇄합니다. – Xeo
'T'는 항상 실제로 전달 된 매개 변수의 형식이 될 것이므로 형식이 안전합니다. 표준 printf는 알지 못합니다. –
제쳐두고, 그것은 끔찍한 타입 안전'printf' 구현입니다.형식 지정자를 무시하고 잘못 해석하며 임시 값 이동을 지원하지 않습니다. 간단히 말해서, typesafe 함수이지만, 그것의 이름에도 불구하고'printf'의 유효한 구현이 아닙니다. 좋은 타입 안전'printf'는 안전 할 때'printf'와 똑같이 행동 할 것이고, 대부분의 안전하지 않은 경우에는 정의되지 않은 것을하지 못할 것입니다. – Yakk