문제

사용해야합니다 std::function 그러나 나는 다음 구문이 무엇을 의미하는지 모르겠습니다.

std::function<void()> f_name = []() { FNAME(); };

사용의 목표는 무엇입니까? std::function? 함수에 대한 포인터를 만드는 것입니까?

도움이 되었습니까?

해결책

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
  }
};

이에 주목하십시오 템플릿 인수는 Lambdas에 추가되었으며 위에서 다루지 않았습니다.

[]<typename T>( std::vector<T> const& v ) { return v.size(); }

1 또한 RTTI가 저장되고 (TypeID), 캐스트 백에서 원래 유형의 작동이 포함됩니다.

다른 팁

라인을 분리하자 :

std :: 기능

이것은 매개 변수를 취하지 않고 값을 반환하지 않는 함수에 대한 선언입니다. 함수가 반환 된 경우 int, 그것은 다음과 같습니다.

std::function<int()>

마찬가지로, int 매개 변수도 사용되면 다음과 같습니다.

std::function<int(int)>

나는 당신의 주요 혼란이 다음 부분이라고 생각합니다.

[]() { FNAME(); };

그만큼 [] 부분은 a라고합니다 캡처 절. 여기에서는 람다 선언에 로컬 인 변수를 넣고 사용 가능하고 싶은 변수를 넣습니다. 이내에 람다 기능 자체. 이것은 "나는 아무것도 캡처하기를 원하지 않는다"고 말하는 것입니다. 이것이 클래스 정의 내에 있고 수업을 람다에서 사용할 수 있기를 원한다면 : 당신은 할 수 있습니다.

[this]() { FNAME(); };

다음 부분은 람다로 전달되는 매개 변수입니다. 규칙적인 기능인 것처럼 정확히 동일합니다.. 앞서 언급 한 바와 같이, std::function<void()> 매개 변수가없는 메소드를 가리키는 서명이므로 비어 있습니다.

나머지는 람다 자체의 본체입니다. 마치 규칙적인 기능인 것처럼 우리는 단지 기능을 호출 할 수 있습니다. FNAME.

또 다른 예

다음과 같은 서명을 가지고 있다고 가정 해 봅시다. 즉, 두 숫자를 합할 수있는 것입니다.

std::function<int(int, int)> sumFunc;

우리는 이제 람다를 이렇게 선언 할 수 있습니다.

sumFunc = [](int a, int b) { return a + b; };

MSVC를 사용하고 있는지 확실하지 않지만 다음은 Lamda Expression Syntax에 대한 링크가 있습니다.

http://msdn.microsoft.com/en-us/library/dd293603.aspx

캡처가있는 람다 (Stateful Lambdas)는 정확히 동일하게 보이더라도 고유 한 유형을 가지고 있기 때문에 서로 할당 할 수 없습니다. 캡처로 람다를 주변에 저장하고 통과 할 수 있으려면 사용할 수 있습니다. "std :: 기능"람다 표현식으로 구성된 기능 객체를 보유하려면 기본적으로"std :: 기능"람다 함수 객체에 다른 컨텐츠 구조를 가진 람다 함수를 할당 할 수있는 것입니다.

Exp :

auto func = [](int a){
 cout << "a:" << a << endl;
};
func(40);
//
int x = 10;
func = [x](int a){ //ATTENTION(ERROR!): assigning a new structure to the same object
 cout << "x:" << x << ",a:" << a << endl;
};
func(2);

따라서 위의 사용법이 잘못됩니다. 그러나 "std :: function"으로 함수 객체를 정의하면 :

auto func = std::function<void(int)>{};
func = [](int a){
  cout << "a:" << a << endl;
};
func(40);
//
int x = 10;
func = [x](int a){ //CORRECT. because of std::function
  //...
}; 

int y = 11;
func = [x,y](int a){ //CORRECT
 //...
}; 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top