8

인수에 대한 const 참조가있는 가변 템플릿 함수를 특수화하는 방법은 무엇입니까?const 레퍼런스를 사용한 Variadic 템플릿 전문

예 :

error: use of deleted function ‘T foo(Args ...) [with T = int; Args = {int, const char*, Test}]’ 
    auto i = foo<int>(10, "test string!", t); 




위의 코드를 컴파일 :

template<typename T, typename... Args> 
T foo(Args... args) = delete; 

template<> int foo(int a, const char* str, const Test& t) { .... } // Fails to compile 
//template<> int foo(int a, const char* str, Test) { .... } // Ok 

int main() { 

    auto i = foo<int>(10, "test string!", t); 
    return 0; 
} 

선언 const Test& 인수와 함께 함수 foo를 호출, 컴파일러는 삭제 기능에 특화된 기능과 폴백을보고 실패 인수에서 const 참조를 제거하면됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

코드는 here

답변

3

자동 템플릿 공제 당신이 그것을에 마지막 템플릿 매개 변수를 설정할 것을 추측 할만큼 똑똑하지 않다 :

귀하의 간단한 방법은 전문화보다는 별도의 과부하를 제공하는 것입니다 Test 대신 const Test&입니다. 보다 정확하게 유형 공제는 항상 유형에서 cv 한정자를 제거합니다.

는 현재 새로운 명시 적 템플릿 인스턴스화 :

auto i = foo<int, int, const char *, const Test&>(10, "test string!", t); 
+0

는 물론, 난 완전히에 대한 명시 적 인스턴스화를 잊어 버렸습니다. 귀하의 답변 주셔서 감사합니다! – Bected

7

기본 템플릿이 호출에 대해 추론 할 템플릿 인수 int, const char*Test하지 const Test&이기 때문에 이것은를 찾을 수 있습니다. 즉, 템플릿 인수가 매개 변수와 일치하지 않으므로 특수화가 사용되지 않습니다.

template <typename T> 
T foo(int a, const char* str, const Test& t) { /*...*/; } 

Live demo