developer tip

std :: function <>과 표준 함수 포인터의 차이점은 무엇입니까?

optionbox 2020. 12. 30. 08:04
반응형

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입니다 지금까지 당신이 만드는 바인딩과 이것 저것을 할 수 있도록, 더 강력한.

참조 URL : https://stackoverflow.com/questions/9054774/difference-between-stdfunction-and-a-standard-function-pointer

반응형