std::function
유형 삭제 객체입니다. 즉, 일부 작업이 어떻게 발생하는지에 대한 세부 사항을 지우고 균일 한 실행 시간 인터페이스를 제공합니다. 을 위한 std::function
, 첫째의1 운영은 복사/이동, 파괴 및 '호출'입니다. operator()
- '콜 연산자와 같은 기능'.
덜한 영어에서는 그것을 의미합니다 std::function
기능 포인터처럼 작용하는 거의 모든 객체를 포함 할 수 있습니다.
지원하는 서명은 각도 브래킷 안에 들어갑니다. std::function<void()>
제로 인수를 받아들이고 아무것도 반환하지 않습니다. std::function< double( int, int ) >
둘을 가져갑니다 int
논쟁과 반환 double
. 일반적으로 std::function
인수 목록에서 인수를 변환 할 수 있고 반환 값을 반환 값으로 변환 할 수있는 함수와 같은 객체를 저장하는 것을 지원합니다.
그것을 아는 것이 중요합니다 std::function
그리고 람다는 호환되는 경우 짐승이 다릅니다.
라인의 다음 부분은 람다입니다. 이것은 C ++ 11의 새로운 구문입니다. ()
. 이러한 객체는 입력하고 지우고 저장할 수 있습니다. std::function
일부 런 타임 오버 헤드 비용으로.
[](){ code }
특히 정말 단순한 람다입니다. 이것에 해당합니다.
struct some_anonymous_type {
some_anonymous_type() {}
void operator()const{
code
}
};
위의 간단한 의사 기능 유형의 인스턴스. 위와 같은 실제 클래스는 컴파일러에 의해 "발명"이며, 구현 된 고유 한 이름 (종종 사용자 정의 유형이 포함 할 수없는 기호 포함)을 포함하여 (나는 발명하지 않고 표준을 따를 수 있는지 알 수 없다. 그러한 수업이지만 내가 아는 모든 컴파일러는 실제로 클래스를 생성합니다).
전체 Lambda 구문은 다음과 같습니다.
[ capture_list ]( argument_list )
-> return_type optional_mutable
{
code
}
그러나 많은 부분을 생략하거나 비워 둘 수 있습니다. capture_list는 결과 익명 유형의 생성자와 그 멤버 변수, argument_list의 인수에 해당합니다. operator()
, 반환 유형은 반환 유형입니다. Lambda 인스턴스의 생성자는 인스턴스가 capture_list로 생성 될 때 마술처럼 호출됩니다.
[ capture_list ]( argument_list ) -> return_type { code }
기본적으로
struct some_anonymous_type {
// capture_list turned into member variables
some_anonymous_type( /* capture_list turned into arguments */ ):
/* member variables initialized */
{}
return_type operator()( argument_list ) const {
code
}
};
이에 주목하십시오 C ++ 20 템플릿 인수는 Lambdas에 추가되었으며 위에서 다루지 않았습니다.
[]<typename T>( std::vector<T> const& v ) { return v.size(); }
1 또한 RTTI가 저장되고 (TypeID), 캐스트 백에서 원래 유형의 작동이 포함됩니다.