boost::function
은 기능 포인터뿐만 아니라 가상 포인터 operator()
을 호출하는 임의의 개체의 전체 복사본을 포함 할 수 있습니다.
어떻게 작동하는지 이해하는 데 도움이 될 수 있습니다 (설명 자료).
다음
struct helper_base { virtual void do_it() = 0; };
template<typename Func>
struct helper:helper_base {
Func func;
helper(Func f):func(f) {}
virtual void do_it() override { func(); }
};
struct do_something_later {
boost::unique_ptr<helper_base> pImpl;
template<typename Func>
do_something_later(Func f):pImpl(make_shared<helper<Func>>(f))
{}
void operator()() { (*pImpl).do_it(); }
private:
do_something_later(do_something_later const&); // deleted
void operator=(do_something_later const&); // deleted
};
내 do_something_later
는 임의의 객체 (Func을)를 소요하고 수요에에 operator()
를 호출 여기
는
boost::function
형 트릭의 장난감 구현입니다.
operator()
을 타입 삭제 도우미에 랩 한 다음 가상 함수를 통해
operator()
을 호출합니다.
Func
유형은 함수 포인터 일 수도 있고 상태가있는 펑터 일 수도 있습니다. 연산자()로 복사 할 수있는 것은 공정한 게임입니다. do_something_later
의 사용자에 관한 한, 이진 인터페이스는 하나뿐입니다.
boost::function
(및 std::function
)은 가능한 많은 인터페이스를 하나의 인터페이스로 바꾸기 위해 기본적으로이 기술을 사용합니다 (많은 개선 사항이 있음). 비용은 virtual
함수 (또는 동일한 수준의 간접 참조) 호출과 관련됩니다.
가상 함수의 여러 변형이 구현되어 있는지 확인 했습니까? 컴파일러는 일종의 까다 롭고 일종의 클래스가 사실상 가상 함수를 구현한다고 확신 할 경우 유형을 추론 할 수 있습니다. – ltjax
차이점은 정규 함수 호출이고 가상 함수 호출은 크기 때문에 그 중 아무 것도 없었다고 생각하지 않았습니다. 충분히 까다로운 컴파일러 최적화가 일어나지 않는다고 나는 만족했다. 귀하의 질문에 –
하지 응답, 성능을 위해 벽에 있다면, 당신은 덜 느린 대안에 관심이있을 수 : [빠른 위임] [1] [1] : HTTP : // –