그래서 여기서 유용한 것은 std::less
과 std::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에서 당신은 사용할 수 있습니다.
대신'std :: greater()'을 전달하십시오. –
고마워요. 클래스 대신 위의 인스턴스를 전달하도록 내 질문을 업데이트했습니다. 오류는 동일합니다. 처음으로 코드를 신중하게 복사하지 않았습니다. 내 잘못이야. – Qaz
그건 그렇고, 매개 변수는 두 int 형을 취하고'bool * '형을 반환하는 함수입니다 (해당 상황에서 함수 포인터로 변환됩니다). – chris