2013-10-08 5 views
1

C++ 11 우리가 사용하는 것을 중지 할 수 있습니다 그 C++ 14의 새로운 기능이 있습니까 :하나 이상의 인수를 구별 할 수 있습니까?

TRACE0("one-string-no-args"); 

TRACE("formatting string with one-or-more args", arg1, arg2, etc); 

이러한 기능이 있었다 이름으로 구별 할 수는 왜냐하면 오버로딩은 제로 - 추가 인수 사례를 하나 이상의 인수 사례와 구분할 수 없기 때문입니다.

이것은 물론 더 이상 인수가 없다는 것을 알 수있는 printf 스타일 인터페이스의 경우 형식 문자열을 형식 문자열로 해석하지 않고 버그 유형을 피할 수 있다는 것을 의미합니다. 최종 출력 문자열.

+6

'무효 추적 (문자열)''템플릿 무효 추적 (문자열, TS ...) 대'컴파일러에 완벽하게 구별 할 수 있습니다. – Xeo

+4

예, ** 가변 템플릿 **이 바로 그 역할을합니다. 이름을 모르는 경우 여기 있습니다. "안전한"인쇄 기능은 가변적 인 템플릿을위한 전형적인 도입 예입니다. – DanielKO

+1

BTW 필자는 한번도 사용 해본 적이 없지만 boost는 아주 멋진 [명명 된 함수 매개 변수 모듈] (http://www.boost.org/doc/libs/1_37_0/libs/parameter/doc/html/index.html)을 가지고 있습니다. if 당신은 정말로 다음 단계로 넘어 가고 싶습니다. – aaronman

답변

3

아마도이 기능의 이름을 모르실 것입니다 : variadic templates.

주된 용도는 가변 개수의 인수에서 가변 개수의 유형을 추론하는 것입니다. (std::make_tuple()과 같이) 어딘가에 저장할 수도 있고, 인수를 사용하여 그걸 사용하기 만 할 수도 있습니다.

void print() {} 

template<class Head, class... Tail> 
void print(Head h, Tail... t) 
{ 
    cout << h << endl; 
    print(t...); 
} 

int main() 
{ 
    print(3, "hello", 4.5); 
} 

여기에 직접보기 : 여기

은 기본적인 사용법이다 http://ideone.com/VA7YGK

당신이 (! 그것 때문에), 당신은 규칙에 일치하는 경우 함수형 프로그래밍처럼 보이는 볼 수 있듯이 그 인수 목록을 머리와 꼬리로 나눈 다음 적은 요소 하나를 사용하여 자신을 호출합니다.

또 다른 예를 들어, 내가 재귀 적 데이터 구조를 정의 최근 질문에서 (짧은 충분히 간단 읽을 수) : Multikey map using variadic templates

std::thread 생성자는 또 다른 예, 그것은 제공하는 가변 인자를받는된다 일단 생성 된 스레드에서 실행을 시작하면 함수에 전달됩니다. 함수 (예 : std::function)와 상호 작용하는 C++ 11의 새로운 기능은 가변적 인 템플릿을 사용하므로 모든 유형의 인수를 허용 할 수 있습니다. std::tuple, std::make_tuple()std::tie()도 사용하십시오.

웹 검색을 통해 더 많은 고급 사용법을 찾을 수 있습니다. 인수 확장에 대한 규칙에 특별한주의를 기울여 완벽한 전달을하십시오.

0

TRACE (일반적으로 Microsoft의 디버깅 매크로에 포함되어 있음)의 경우, 해당 언어는 전처리 매크로를 처리하는 데 "새로운"방법이 없습니다 (실제로는 이전과 동일 함).

일반적으로 함수의 경우 가변 인수 함수가 항상 지원됩니다 (예 : printf).

0

이것은 어리석은 것처럼 보일지 모르지만, 유지해야 할 메트릭 톤의 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); 
} 
관련 문제