2013-01-10 6 views
0

1 개 인수를 복용 함수가 아닙니다 :술어 펑, 그건 내가 unary_function에서 상속 펑터 클래스가

template<class T> 
class Matcher : public std::unary_function<T, bool> 
{ 
private: 
    int m_match; 

public: 
    Matcher(int valToMatch) : m_match(valToMatch) { }; 
    bool operator() (T toTest) 
    { 
     return T.prop == m_match; 
    } 
} 

이러한 것들 중 하나를 사용되는 기능 :

void DoStuff(std::unary_function<ThisType, bool> & pred, 
      vector<ThisType> & stuffToTest) 
{ 
    for(vector<ThisType>::iterator it = stuffToTest.begin(); 
     it != stuffToTest.end(); ++it) 
    { 
     if(pred(*it))  // <<< Compiler complains here 
     { 
      // do stuff 
     } 
    } 
} 

원래 호출 기능 :

Matcher myMatcher<ThisType>(n); 
// have vector<ThisType> myStuff 
DoStuff(myMatcher, myStuff); 
지금까지 내가 아는 한, 내가 whic의, 템플릿 기반 펑터가

h ThisType 유형으로 인스턴스를 생성 중입니다.이 유형은 unary_function 인수를 기대하는 함수에 전달하고 ThisType의 인스턴스로 호출합니다.

하지만 컴파일러는 "용어가 하나의 인수를 취하는 함수로 평가되지 않습니다."라는 불평을합니다.

무엇이 누락 되었습니까?

답변

5

함수에 파생 클래스 개체를 전달하는 경우에도 함수 매개 변수는 이고 인수가 하나만있는 operator() 멤버가 있기 때문입니다. 따라서 오류.

난 당신이 같은 함수 템플릿으로 기능을 변경하는 제안 : 다형성 타입이 아닌

template<typename F> 
void DoStuff(F && pred, vector<ThisType> & stuffToTest) 
{ 
    for(auto it = stuffToTest.begin(); it != stuffToTest.end(); ++it) 
    { 
     if(pred(*it)) 
     { 
      // do stuff 
     } 
    } 
} 
+0

매우 명확합니다. 여기에서 템플릿 화 DoStuff의 문제는 그것이 ThisType에 이미 한정되어 있기 때문에, predicate은 항상 pred (ThisType)이 될 것입니다. –

+0

@PhilH : 그건 중요하지 않아야합니다. 원하는 경우'std :: function '을 매개 변수 유형으로 사용할 수 있지만 최적화를 방해하고 형식 지움으로 인해 느린 코드가 생성된다는 것을 제안하지는 않습니다. 다른 손 서식 코드는 더 빨리 코드를 생성합니다. – Nawaz

+0

이것이 C++의 pre-0x (그러나 tr1과 함께) 버전이기 때문에 다시 생각해야 할 것입니다. –

2

unary_function, 그것은 argument_typeresult_type 회원 유형을 제공하는이 단지 기본 클래스입니다.

당신은 당신의 DoStuff 기능 std::function<bool(ThisType)>에 전달하거나 당신에게 DoStuff 함수 템플릿

+0

건배, 불행히도 나는이 컴파일러로 C++ 11에 대한 액세스 권한이 없습니다. –