2014-03-28 4 views
9

std :: greater <int> 또는 std :: less <int>을 인수로 사용하는 매개 변수를 사용하여 함수를 만들고 싶습니다. 나는 매개 변수에 대한 구문에 붙어있어.std :: greater 또는 std :: less를 인수로 사용하는 매개 변수

이 내가 시도 형식입니다 :

myFunction(int a, int b, bool *comp(int, int)) { … } 
… 
std::greater<int> bigger; 
myFunction(2, 3, bigger); 

하지만, * 작동하지 않습니다, 나는 세 번째 매개 변수 그냥 완전히 잘못 생각한다. 그것은 실제로 무엇이어야 하는가?

* 변환 할 수 없습니다 '표준 : : 큰'부울 * (*) (INT, INT)

+2

대신'std :: greater ()'을 전달하십시오. –

+0

고마워요. 클래스 대신 위의 인스턴스를 전달하도록 내 질문을 업데이트했습니다. 오류는 동일합니다. 처음으로 코드를 신중하게 복사하지 않았습니다. 내 잘못이야. – Qaz

+1

그건 그렇고, 매개 변수는 두 int 형을 취하고'bool * '형을 반환하는 함수입니다 (해당 상황에서 함수 포인터로 변환됩니다). – chris

답변

10

기능은 일반적으로 템플릿을 통해 구현됩니다 :

template <typename Comparator> 
myFunction(int a, int b, Comparator comp) { … } 

하지만 당신은 그것을 구현하는 std::function을 사용할 수

첫 번째 버전은 헤더에 코드를 표시하지만 일반적으로 성능이 향상됩니다. 두 번째 버전에서는 .cpp 파일의 구현을 으로 숨길 수 있지만 비교기 호출을 인라인 할 수 없기 때문에 성능이 저하됩니다.

2

를 사용하여 템플릿 '에 : 비교기를 복용

template<class Callable> 
myFunction(int a, int b, Callable f); 
7

그래서 여기서 유용한 것은 std::lessstd::greater이 실제로 사소한 구성이 가능한 상태없는 함수 객체라는 것입니다. 그러나 함수 포인터로의 형 변환은 지원하지 않습니다.

효율적인 선택은 (A) template 인수를 통해 비교기를 가지고 헤더의 코드 실행 중입니다

template<typename C> void myFunc(int a, int b, C comp) 

당신이 헤더 파일, 또는 (B)에서 그것을 구현하는 것을 의미 입력 std::function< bool(int, int) >을 통해 함수 객체를 지우 : (?! 어쩌면 중요한 프로필) 일부 비용이

void myFunc(int a, int b, std::function< bool(int, int) > comp) 

을 (힙 할당이 무 표준에 대한 작은 물체 최적화를 통해 피할 덜/더 큰,하지만 그것은비용을하는 경향이있다함수 호출에 관계없이 인라인을 차단할 수도 있음).

또는 (C) 당신이 무 펑터를 가지고 함수 포인터으로 바꿀 수 있습니다 몇 가지 코드를 작성하십시오 template 기능 as_function_ptr이 무 펑터의 형태를 취하고 멀리 던져 생성

template<typename T> 
using Type = T; 
template<typename StatelessFunctor> 
struct function_ptr_of_stateless_t { 
    template<typename R, typename... Args> 
    operator Type<R(Args...)>*() const { 
    return [](Args... args)->R { 
    return StatelessFunctor()(std::forward<Args>(args)...); 
    }; 
    } 
}; 
template<typename StatelessFunctor> 
function_ptr_of_stateless_t<StatelessFunctor> as_function_ptr() { 
    return {}; 
} 

bool myFunction(int a, int b, bool(*comp)(int, int)) { return comp(a,b); } 
int main() { 
    std::cout << myFunction(3,7, as_function_ptr<std::less<int>>()) << "\n"; 
} 

을 형식을 호환 가능한 모든 포인터 유형으로 캐스팅 할 수 있습니다.

빠르게 virtual 방법을 통해보다 경향이 함수 포인터를 통해 호출로이의 std::function 솔루션보다 소폭 적은 오버 헤드를 가지고, 또한 (GCC 같은) 일부 컴파일러도에서, 인라인 함수 포인터 꽤 괜찮은 있습니다 하나의 편집 단위.

int main() { 
    std::cout << myFunction(3,7, as_function_ptr<std::less<>>()) << "\n"; 
} 

하고 여전히 꽤 최적으로 작동합니다 보너스로

, C++ 14에서 당신은 사용할 수 있습니다.