2012-03-09 4 views
9

필자가 읽었으며 시도한 것으로부터 함수 템플릿에 기본 인수를 넣을 수 없습니까? 필자는 컴파일러와 다른 사람이 모두 응답 한 것을 많이 골랐다 ... 내가 newb이고 좀 더 기술적 인 답변을하기가 쉽지 않기 때문에 묻는다. 이 문제가 해결 되었습니까? 나는 ... 기본 관계 연산자를 사용하는 findmax 기능을 만들려고 해요하지만 옵션으로 과부하 예 :함수 템플릿의 기본 인수 C++

template <typename Type, typename Compare = std::less<Type> > 
Type FindMax(std:vector<Type> &vec, Compare comp = Compare()) { 
    return *std::max_element(... 
} 

은 내가 이것에 대한 클래스를 만들 수도있을 것 같군요하지만 많은 작업처럼 보인다 내가 정말로 원했던 것이 하나의 기능 일 때 ... 고마워!

이 기능 tempate 할 무엇, 구체적으로는 (cmpFn) ...) 기본 인수는 무엇을하고있다 : 전에 뭔가에 대해 또 다른 질문을뿐만 아니라 추가해야

내가 본 것인가?

template <typename ElemType> 
    ElemType FindMax(Vector<ElemType> &v, int (cmpFn)(ElemType, ElemType) = OperatorCmp) 
+0

가능한 중복 * [C++ 템플릿 함수 기본값] (http://stackoverflow.com/questions/3301362/c-template-function-default-value) *. –

답변

8

은 여러 가지 대답이 있습니다 : 사용자가 정의한 어떤

  1. 기능 템플릿 아닌 클래스 템플릿입니다. 당신이 기본 템플릿 매개 변수

    typename Compare = std::less<Type>

    을 사용하고 있기 때문에 나는 모든 I 기능 템플릿 표준의 이전 버전에서 기본 템플릿 매개 변수를 허용하지 않았다 알고 있기 때문에 당신은 이미, C++ (11)를 사용하는 가정 . 한편

  2. , 기본 인수는이

    Compare comp = Compare()

    같은 템플릿 매개 변수의도 표준의 이전 버전에서 가능했다. 디폴트 인수가 템플릿 매개 변수에 대해 가능하지 않다는 진술은 틀린 것입니다 (또는 아마도 기본 템플릿 매개 변수).

  3. 받은 다른 컴파일러 오류 메시지은 다른 문제가 있어야합니다. 아마도 Type이 사용되면 std::less과 잘 맞지 않거나 사용하는 Compare 유형은 기본 생성자를 구현하지 않습니다. 어떤 경우이든 다음 프로그램은 GCC 4.6에서 컴파일됩니다.2 (즉, 더 잘 보였다 때문에 나는 const std::vector<> &std::vector<> &을 변경주의) :

 

#include <vector> 
#include <functional> 
#include <algorithm> 

template <typename Type, typename Compare = std::less<Type> > 
Type FindMax(const std::vector<Type> &vec, Compare comp = Compare()) { 
    return *std::max_element(vec.begin(),vec.end(),comp); 
} 

int main() { 
    FindMax(std::vector<int>()); 
    return 0; 
} 

을 그리고 실제로 이것은 -std=C++0x 옵션을 필요로하지만, 그 때문에 기본 템플릿 매개 변수,하지 디폴트의 ​​인수 함수 매개 변수를 선언

함수 자체, 즉 인수 : cmpFn 관련된 추가적인 질문 정보

. 선언

int (cmpFn)(ElemType, ElemType) 

는 리턴 타입 int이고, 함수의 로컬 이름 cmpFn 의미하고, 두 종류 ElemType의 두 인자를. 아이디어는 호출자가 벡터의 요소를 비교하는 데 사용될 함수 (또는 펑터)를 전달할 수 있다는 것입니다. 예 : 이 같은 함수 선언하기 전에 인수 OperatorCmp의 기본값을 정의하는 경우 :

int OperatorCmp(int a, int b) { 
    return (a<b?-1:(a>b?1:0)); 
} 

선언은 유효하게 당신은 std::vector<int>의 최대 값을 찾기 위해 사용할 수 있습니다.

+0

감사합니다. 그 두 번째 부분은 내가 찾던 것입니다. 나는 그것을 깨닫지 못했습니다 ... 함수 매개 변수입니다. – MCP

+1

주 :'cmpFn'은'std :: max_element'와 함께 사용할 수 없습니다. 왜냐하면 삼항 결과가 아닌 부울 결과 ('<')와 유사하기 때문입니다. –

5

C++ 11에서이를 수행 할 수 있습니다. C++ 03부터는 인수의 수가 다른 두 개의 오버로드를 생성하고 한 인수에서 다른 인수로 전달함으로써 쉽게 해결할 수 있습니다.

template <typename Type> 
Type findMax(std::vector<Type> const & v) { 
    return findMax(v, std::less<Type>()); 
} 

또는 표준 알고리즘을 사용하여 직접 작성하지 않아도됩니다.