2013-03-08 1 views
0

binder2ndunary_function으로부터 유도된다.C++의 STL unary_function은 gcc 4.7.x에서 구현 된 것처럼 가상 함수를 가질 수 있습니까?

다음 코드는 작동하지 않습니다

greater<int> g; 

    //greater is derived from binary_function 

//bind2nd returns binder2nd object and binder2nd is derived from unary_function 

const unary_function<int,bool> &greater_than_0 = bind2nd(g, 0); 

    // base class reference type holding reference to derived class object 

remove_if(lst.begin(), lst.end(), greater_than_0); 
    //does not work 

을 다음과 같은 코드가 작동하는 반면 :

greater<int> g; 

const binder2nd< greater<int> > &greater_than_0 = bind2nd(g, 0); 

remove_if(lst.begin(), lst.end(), greater_than_0); 

unary_function에 더미 가상 함수를 가지고 도움이 될 것입니다 그래서 첫 번째 코드 스 니펫이 작동합니다. STL의 사용을 향상시킬 수 있습니까?

+1

이러한 함수는 일반 ['std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind)에서 더 이상 사용되지 않습니다. –

+0

당신이'std :: function'을 원한다고 생각합니다, 다형성입니다 –

+0

가상 함수가 어떻게 도움이 될지 모르겠습니다 ... 사실 저는 여러분이'가상'을 전혀 언급하지 않았다고 생각합니다. 초과 적재? –

답변

2

unary_function은 파생 클래스에 몇 가지 typedef를 추가하는 편리한 유형입니다. 아니요 다형성입니다. 클래스 정의에서 기본 클래스가 아닌 이름으로 언급 한 코드를 작성하면 실수로 실수를 저 지르게됩니다.

+0

이 대답은 문제를 요약합니다. 나는 두 가지 더 많은 주석을 던지고 싶다 : baseclass에 가상 함수가 없다면이 클래스에 대한 참조를 사용하는 모든 사람은 가상 함수를 볼 수 없다. C++의 기존 클래스에는 이들을 삽입 할 수 없습니다. 둘째, STL 코드를 통과 한 펑터가 복사됩니다! unary_function에 가상 함수가있는 경우에도 복사로 잘라낼 수 있습니다. 기억하십시오 : 템플릿은 컴파일 타임 다형성, a.k.a. duck typing을 사용합니다. –

관련 문제