이것은 어리석은 것처럼 보일지 모르지만, 유지해야 할 메트릭 톤의 C 스타일 printf 코드가 있습니다.
부스트의 서식 지정 라이브러리를 사용하여이 모든 것을 다시 작성할 수 있으며, 요즘에는 그 중 하나가 될 것입니다. 그러나 그 사이에 하나의 인수 또는 하나 이상의 인수를 구별 할 수있는 것은 큰 발전입니다.
https://stackoverflow.com/users/365496/bames53 언급 했으므로 가능합니다. 코드가 부풀어 오를 가능성이 있으며, 여전히이 함정이 모두 인쇄되어 있다는 경고가 표시됩니다. 여기
는 ++ MFC/C의 직업 수행하는 간단한 예입니다
bool Write(const wchar_t * pszText);
template <typename T> bool Write(const wchar_t * pszFormat, T, ...);
<를 작성하면서 쓰기> 출력을 구축하기 위해 이렇게 않습니다 필요가 없다 (그리고 안) 전화 vwsprintf 동등한 문자열을 Write에 전달하기 전에.
매우 우아합니다. 두 번째 인터페이스 만 제공하는 문제를 제거합니다. 그런 다음 한 문자열에 우발적 인 printf 형식 지정자가있는 경우 printf 문제가 발생하거나 클라이언트가 Write()와 WriteFormat()을 지정하도록 강요하거나 Write()를 호출하기 전에 로컬로 문자열을 생성하십시오.
가 여기에 쓰기로 정의 <>을 쓰기입니다 :
template <typename T> bool SimpleTextFile::Write(const wchar_t * pszFormat, T, ...)
{
va_list arglist;
va_start(arglist, pszFormat);
CStringW buffer;
buffer.FormatV(pszFormat, arglist);
va_end(arglist);
return Write(buffer);
}
'무효 추적 (문자열)''템플릿 무효 추적 (문자열, TS ...) 대'컴파일러에 완벽하게 구별 할 수 있습니다. –
Xeo
예, ** 가변 템플릿 **이 바로 그 역할을합니다. 이름을 모르는 경우 여기 있습니다. "안전한"인쇄 기능은 가변적 인 템플릿을위한 전형적인 도입 예입니다. – DanielKO
BTW 필자는 한번도 사용 해본 적이 없지만 boost는 아주 멋진 [명명 된 함수 매개 변수 모듈] (http://www.boost.org/doc/libs/1_37_0/libs/parameter/doc/html/index.html)을 가지고 있습니다. if 당신은 정말로 다음 단계로 넘어 가고 싶습니다. – aaronman