2016-07-12 2 views
3

은 가능한이 템플릿 선언을 전문으로하는 것입니다C++ 가변 인자 템플릿 특수화 (그리고 static_assert)

template <> int Foo<int>(float args) { 
    return 42; 
} 

을 ...하지만 난 항상 충돌 정적으로 사용하려고 할 때 다음과 같이 사용하십시오.

auto value = Foo<int>(1.5f); 

올바른 구문은 무엇입니까?

+0

어쩌면 그냥 컴파일러 그냥이 답변처럼를 지원하지 않는 있다는 : http://stackoverflow.com/questions/ 7767202/template-specialization-with-variadic-templates? rq = 1? – Louen

+0

어떤 컴파일러를 사용합니까? Clang과 MSVC가 코드를 컴파일하고 'value'가 42를 유지합니다. –

답변

3

같은 것을 사용합니다.

당신은 귀하의 경우 = delete을 사용할 수 있습니다

:

template <class TYPE, class... ARGS> TYPE Foo(ARGS... args) = delete; 

template <> int Foo(float) {return 42;} 

Demo

+0

충분하지 않습니다'template TYPE Foo (ARGS ... args);이 경우에는? – skypjack

+1

@skypjack : 링크 오류가 발생하지만'= delete'로 컴파일 오류가 발생할 수 있습니다. – Jarod42

+0

알겠습니다. 고마워요. – skypjack

6

인스턴스화되지 않은 경우에만 유효한 템플릿을 작성할 수 없습니다. 즉, 충돌한다 표준에 다음과 같은 규칙의 실행 : 유효한 전문화가 템플릿을 생성 할 수없는 경우

, 그 템플릿이 인스턴스화되지 템플릿이 잘못 형성되고, 어떤 진단 할 필요가 없습니다. 당신이 이런 경우 몸과 같은

static_assert(sizeof(TYPE) != sizeof(int)); 

뭔가가 있다면 다른 한편으로

, 괜찮을 것 템플릿은 유효하며, 코드는 명시 적 전문성 때문에 컴파일 사실 기본 템플릿 대신 사용됩니다. http://coliru.stacked-crooked.com/a/238b979fd10c62c0

-2

정적 어설트는 템플릿에 의존하지 않으므로 항상 실행됩니다. static_assert가 발생한다, 그래서 false 비 템플릿 의존 상태로

template <class TYPE, class... ARGS> TYPE Foo(ARGS... args) { 
    static_assert(sizeof(TYPE) != sizeof(TYPE)); 
} 
+0

컴파일러가 현재이를 진단하지 않아도 똑같이 나빠질 수 있습니다. –

+0

@TC : 올바르게 진단합니다 - 실패한'static_assert'에 대한 올바른 진단은 오류입니다 ... 표준 상태에서'static_assert'가 실패한 컴파일 단계는 비 종속 표현식에 대한 템플리트 정의에 있습니다. 종속 표현식에 대한 인스턴스화. 따라서'static_assert'가 인스턴스 생성시에만 실행되기를 원한다면 조건 자체가 템플릿 인자에 의해 영향을받지 않더라도 그것을 종속적으로 만드십시오. – Dani

+0

이 템플릿의 유효한 특수화를 생성 할 수 없으므로 컴파일러는 정의 시간에이 템플릿을 진단 할 수 있습니다. 이 견적은 Brian의 대답입니다. –