2012-11-06 5 views
3

나는 std :: enable_if를 처음 사용하고 어떻게 사용하는지 궁금하다. 나는이 가능하여 표준 : enable_if을 할 수 C++ std :: enable_if

template<int a, int b> 
class foo { 
} 

가 지금은 단지가 10 에 B와 동일 + 때 인스턴스화 할 : 나는 템플릿 클래스가?

두 번째 질문 : 내가

template<int a, int b> 
class foo { 
    int c; 
} 

가 난 단지

a = 5. 

가 어떻게 사용 표준 : enable_if 그렇게 할 때 C를 갖고 싶어 클래스 foo는의 구성원이 있다면? std :: enable_if를 사용하는 올바른 사례입니까?

+2

를 사용하지 마십시오. * 함수 * 템플릿의 * 추론 * 유형에만 해당됩니다. –

+2

@KerrekSB : 또는 클래스 템플릿의 특수화를 사용하지 않도록 설정하십시오. 두 가지 모두 오랫동안'boost :: enable_if'의 핵심적인 사용법이었으며, 둘 다 유효한 유즈 케이스입니다. 이 작업은 대개 템플리트를 여러 번 사용하지 않고 단순히 다른 템플리트를 선택하는 기본 템플리트의 여러 전문화의 컨텍스트에서 수행됩니다. –

+0

@ DavidRodríguez-dribeas : 좋은 지적입니다. 나는 지금까지 클래스 템플릿 전문화에 많은 것을 사용하지 않았다 ... –

답변

12

난 당신이

template<int a, int b> 
class foo { 
    static_assert(a+b==10, "a+b is not 10"); 
}; 

int main() 
{ 
    foo<5,5> f; // will compile 
    foo<1,5> f; // will fail to compile with error: a+b is not 10 
    return 0; 
} 

enable_if 주로 조건부 유형의 특성에 따라 오버로드 확인에서 함수와 클래스를 제거하고 별도의 기능 과부하 및 전문화를 제공하는 데 사용됩니다 대신 enable_if의 제약 조건을 적용 할 static_assert 더 사용할 수있는 것 같아요 다른 유형 형질에 대해서.

+2

필자는 내 라이브러리 사용자에게 심각한 두통을 안겨주기 위해'std :: enable_if' 기반의 솔루션보다이 솔루션을 선택하려고합니다. –

+0

그래, 난 enable_if 사용법을 배우고 싶다. 그러나 이것은 매우 나쁜 예입니다 :) – WhatABeautifulWorld

11
template<int a, int b, typename T = typename std::enable_if<a + b == 10>::type> 
class foo { 
}; 

이 작업을 수행해야합니다. 템플릿을 인스턴스화 할 때 세 번째 템플릿 매개 변수를 명시 적으로 제공하지 않았는지 확인하십시오.


다른 언급처럼, static_assert은 훨씬 더 적합합니다.

+3

+1 : 특정 조합을 강제로'static_assert'하는 동안 이것은 더 낫습니다. 이것은 기본 템플릿의 여러 특수화를 생성하고 intantiating 인수의 속성을 기반으로 하나 또는 다른 것을 선택할 수 있으므로 더 강력합니다. –

+0

+1 템플릿 매개 변수에서 산술 및 논리 표현식을 사용할 수 있음을 가르치기 위해 –

+0

This 하나는 컴파일되지 않습니다 ... – WhatABeautifulWorld

3

단순, 단지 enable_if`가 무엇인지 '아니라고 enable_if

template<bool Ten> 
struct Base 
{ 
    int c; 
}; 

template<> 
struct Base<false> 
{ }; 

template<int a, int b> 
struct foo : Base<a+b == 10> 
{ 
};