std :: function <>과 표준 함수 포인터의 차이점은 무엇입니까?
이 질문에 이미 답변이 있습니다.
std :: function <>과 표준 함수 포인터의 차이점은 무엇입니까?
그건:
typedef std::function<int(int)> FUNCTION;
typedef int (*fn)(int);
그들은 사실상 같은 것입니까?
함수 포인터는 C ++로 정의 된 실제 함수의 주소입니다. 는 std::function
모든 유형의 호출 가능 객체 (함수처럼 사용할 수있는 객체)를 보유 할 수있는 래퍼입니다.
struct FooFunctor
{
void operator()(int i) {
std::cout << i;
}
};
// Since `FooFunctor` defines `operator()`, it can be used as a function
FooFunctor func;
std::function<void (int)> f(func);
여기에서 std::function
어떤 종류의 호출 가능한 객체를 다루고 있는지 정확히 추상화 할 수 있습니다.-당신은 그것이 무엇인지 FooFunctor
모르고, 그것이 반환 void
되고 하나의 int
매개 변수 가 있다는 것을 알고있을뿐입니다 .
이 추상화가 유용한 실제 사례는 다른 스크립팅 언어와 함께 C ++를 사용할 때입니다. C ++로 정의 된 함수와 스크립팅 언어로 정의 된 함수를 일반적인 방식으로 처리 할 수있는 인터페이스를 디자인 할 수 있습니다.
편집 : 바인딩
함께 std::function
, 당신은 또한 발견 할 것이다 std::bind
. 이 두 가지는 함께 사용하면 매우 강력한 도구입니다.
void func(int a, int b) {
// Do something important
}
// Consider the case when you want one of the parameters of `func` to be fixed
// You can used `std::bind` to set a fixed value for a parameter; `bind` will
// return a function-like object that you can place inside of `std::function`.
std::function<void (int)> f = std::bind(func, _1, 5);
하여 그 예에서, 함수 객체가 리턴 bind
첫번째 매개 변수를 사용 _1
하고, 그것을 전달 func
은 AS a
파라미터 세트 및 b
상수로 5
.
그들은 전혀 동일하지 않습니다. std::function
모든 종류의 호출 가능한 엔티티를 보유 할 수있는 복잡하고 무겁고 상태 저장에 가까운 마법 유형이지만 함수 포인터는 실제로 단순한 포인터입니다. 그것을 피할 수 있다면 네이 키드 함수 포인터 또는 auto
- bind
/ auto
-lambda 유형을 선호해야합니다 . std::function
함수, 펑터, 람다 캡처 및 바인드 표현식과 같은 이기종의 호출 가능한 엔티티 컬렉션을 구성하는 체계적인 방법이 정말로 필요한 경우 에만 사용 하십시오.
업데이트 :auto
유형 에 대한 약간의 설명 : 다음 두 기능을 비교하십시오.
void do_something_1(std::function<void(int)> f, int a) { f(a); }
template <typename F, typename A> void do_something_2(F f, A a) { f(a); }
이제 람다 또는 bind
식을 사용하여 호출하는 것을 상상해보십시오 .
do_something_X([foo, &bar](int n){ bar += n*foo; }, 12);
do_something_X(std::bind(X::bob, &jim, true, _1, Blue), 13);
두 경우 모두 인수 F
가 알 수없는 실제 유형의 표현식으로 추론 되기 때문에 템플릿이있는 두 번째 버전이 더 효율적 입니다. 와 함께 첫 번째 버전 std::function
은 템플릿이 아니며 더 간단하고 신중하게 보일 수 있지만 항상std::function
객체를 구성해야 하며 여러 유형 삭제 및 가상 디스패치 비용이 발생할 수 있습니다.
A std::function
에는 상태가 있습니다. 추가 매개 변수를 "바인드"할 수 있습니다.
이러한 매개 변수는 다른 클래스, 기타 함수 또는 멤버 함수 호출을위한이 포인터와 같은 것에서 다양 할 수 있습니다.
대체 함수 포인터는 typedef int (*fn)(int);
그것 에서 숨겨 질 상태를 reperensting typedef int (*fn)(void*,int);
와 함께 입니다.void*
std::function
아니.
하나는 함수 포인터입니다. 다른 하나는 함수 포인터 주위의 래퍼 역할을하는 객체입니다.
그들은 꽤 많이 표현 같은 일을하지만 std::function
입니다 지금까지 당신이 만드는 바인딩과 이것 저것을 할 수 있도록, 더 강력한.
'developer tip' 카테고리의 다른 글
유형 차이 적용 (0) | 2020.12.30 |
---|---|
StringBuilder.append 체인이 문자열 연결보다 효율적입니까? (0) | 2020.12.30 |
Mac에서 Bash를 사용하여 기본 브라우저로 .html 파일 열기 (0) | 2020.12.30 |
zsh 함수 정의를 표시하는 방법 (예 : bash "type myfunc")? (0) | 2020.12.30 |
Laravel 4의 모든 캐시를 플러시합니다. (0) | 2020.12.30 |