2012-03-28 5 views
0

현재 함수 오버로드 및 함수 포인터를 모두 파악하려고합니다. 코드 조각을 줄이려면 비교 연산자에 대한 함수 포인터를 만들고 싶습니다. 내 원래 코드에서 루프 물마루 및 부동 변수의 쌍을 많이 비교하십시오. 비교 후의 내 동작은 세 번째 반 정적 변수가 양수인지 음수인지에 따라 다릅니다. 이 버전에서는 모든 쌍의 세미 - 정적 변수의 값을 확인하거나 코드를 많이 복제해야합니다. 내가 대신 한 번 angleRight을 평가할 수있는 다음 중 하나를 연산자> 또는 운영자 <에 대한 함수 포인터를 저장하는 경우함수 포인터 비교 연산자

double angleRight; //This variable is either positive or negative and is not reassigned for the purpose of this code 

while (points.size() > 2){ 
siz = points.size(); 
for (int i = 0; i < siz; i++){ 
    if (angleRight > 0 && points[i].angle < 0){ 
<Do something> 
    <remove points[i]> 
    } else if (angleRight < 0 && points[i].angle > 0){ 
    <Do something else> 
     <remove points[i]> 
    } 
} 

것은, 내가 대신이 함수 포인터를 사용할 수있을 것입니다 전체뿐만 아니라 angleRight 평가를 피할 수 'else'-block. 함수 포인터를 이해하려고 노력했으며 오버로드 된 멤버 함수에 액세스하려는 경우 어떻게 관리했는지 알 수있었습니다. '덜'내가 원하는 무엇 두 기능 '큰'및 제작 :

//This does not compile: 
bool (*compar) (float) /*const*/ = &float::operator<; 

편집이 :

//This compiles 
class Bs{ 
    public: 
    float x; 
    bool operator< (Bs y){ 
    return x < y.x; 
    } 
}; 
bool (Bs::*compare) (Bs) /*const*/ = &Bs::operator<; 

그러나 내가 정말로 원하는 것을/상상이 같은 것입니다

bool greater(float x, float y){ 
    return x > y; 
} 
bool less(float x, float y){ 
    return x < y; 
} 

bool (*compar) (float, float) = (angleRight < 0)? &greater : &less; 

하지만 실제로 기능을 작성해야한다는 것을 귀찮게합니다. float-operator>에 직접 액세스 할 수있는 방법이 있습니까?

+0

이 질문의 궁극적 인 목표는 무엇입니까? 당신이 "함수 오버로딩과 함수 포인터를 모두 잡으려고"했기 때문입니까, 아니면 실제로 루틴을보다 효율적으로 만들고 싶습니까? –

+0

둘 다. 더 나은 (더 예쁘거나 더 효과적인) C++ 코드를 배우기위한 코드를 작성 중입니다. 나는 나의 코드를 향상 시키려고 노력하고 있지만, "더 깊은 언더 샌드 랜드"를 얻는 것도 똑같이 중요하다. 함수에 대한 포인터를 사용하면 꽤 효과적이었습니다. – clearfix

답변

1

이와 같은 작업을 수행하는 C++ 방식은 함수 포인터를 수락하는 것이 아니라 함수와 유사한 객체을 수락하여 수행합니다.

예 : 우리가 오랫동안 두 피연산자 operator() 지원하는, Cmp는 정확히 상관 없어이 예에서

template <class T, class Cmp> int cmp(T x, T y, Cmp cmp_func = std::less) { 
    return cmp_func(x, y) - cmp_func(y, x); 
} 

.

함수가 function-like-object를 허용하면 std::less과 같은 표준 객체를 사용하여 자동으로이 문제를 해결할 수 있습니다.

+0

'더 크게'와 '더 작게'두 가지 기능을 만들고 싶지만 기능을 실제로 작성해야한다는 것을 귀찮게합니다. float-operator>에 직접 액세스 할 수있는 방법이 있습니까? – clearfix