이것은 일반적으로 템플릿으로 수행됩니다. 이처럼 :
#include <iostream> // For example output only.
template <typename F>
void sort(F&& pred) {
pred(123);
}
void normal_func(int v) {
std::cout << "normal_func(" << v << ")\n";
}
struct my_pred {
void operator()(int v) const {
std::cout << "my_pred(" << v << ")\n";
}
};
int main() {
sort([](int v) { std::cout << "Called lambda func with " << v << '\n'; });
sort(normal_func);
sort(my_pred());
}
그러나 템플릿을 사용할 수없는 경우, 가장 좋은 건 std::function
같은 다형성 함수 래퍼를 사용하는 것 (또는 boost::function
, 또는 당신이 당신의 자신의 간단한 버전을 쓸 수 있습니다).
또는 하드 코어 C 스타일의 일반 함수를 사용자가 상황을 저장할 수있는 void 포인터와 함께 사용할 수 있습니다. 예 : qsort()
. 가능하다면 나는 거기에 가지 않으려 고 노력 하겠지만.
#include <iostream> // For example output only.
#include <functional> // For std::function.
void sort(const std::function<void(int)>& pred) {
pred(123);
}
void normal_func(int v) {
std::cout << "normal_func(" << v << ")\n";
}
struct my_pred {
void operator()(int v) const {
std::cout << "my_pred(" << v << ")\n";
}
};
int main() {
sort([](int v) { std::cout << "Called lambda func with " << v << '\n'; });
sort(normal_func);
sort(my_pred());
}
는 희망이 도움이 :
여기 std::function
를 사용하는 예입니다.
는 문제가되지 않습니다 템플릿을 사용 - 단지 (보통)가 헤더에 정의 될 필요가 있음을 기억하십시오. 어떤 이유에서든 템플릿을 피하고 여분의 런타임 비용에 신경 쓰지 않는다면, 타입 지우기 대안 ('std :: function'과 같은)이 있습니다. –
'sort' 함수의 본문은 얼마나 큽니까? 컨테이너에 반복자 기반 액세스를 노출 할 수있는 기회가 있습니까? – Yakk
기본적으로 표준 정렬 함수에 대한 호출을 위임합니다. – user1242967