C 스타일 함수 포인터와 람다로 채워진 벡터를 만드는 방법 (캡처 유무)

레몬 그랩 백작

최근에 람다와 함수 포인터에 대해 배우고 있으며 간단한 콜백 시스템에서 사용하고 싶었습니다. 이벤트를 저장하는지도와 트리거 될 때 호출해야하는 모든 콜백은 다음과 같습니다
std::unordered_map< sf::Event::EventType , std::vector< Callback > > eventMap;.

나는 이런 식으로 콜백을 정의했다 typedef void(*Callback)(sf::Event const&);. registerEvent()함수는 이벤트와 콜백을 인수로받습니다.
registerEvent()그런 다음 다음과 같이 호출 할 수 있습니다.

inputHandler.registerEvent(/*Any event type*/, [](sf::Event const&)
{
    //do something
});

그것은 잘 작동하지만 객체를 캡처하고 싶을 때 error: no matching function for call to ‘InputHandler::registerEvent(sf::Event::EventType, Button::Button(ID, Callback, InputHandler&)::<lambda(const sf::Event&)>)’그 오류를 생성하는 코드는 다음과 같습니다.

class Button
{
//
public:
    Button(ID id, Callback callback, InputHandler& inputhandler)
    {
        inputhandler.registerEvent(sf::Event::MouseButtonPressed, [this](sf::Event const&)
        {
            {
              getTextureRect();  
            }
        });
    }
};

것처럼 보인다 this캡처가와는 호환되지 않는 람다의 유형 변화 registerEvent()기능. 그러나 많은 다른 클래스가 그러한 람다를 만들 수 있어야하고 캡처가없는 람다도 벡터에 포함되어야하므로 벡터가 어떤 유형이어야하는지 어떻게 알 수 있는지 모르겠습니다. 나는 들었지만 std::function(어리석게 들릴 수 있음) 더 나은 이해를 위해 C-Style 방식을 사용하고 싶습니다. 나는 이것을 생각 한다포스트는 그것에 대해 뭔가를 말했지만 나는 그것을 잘 이해하지 못합니다. 나는 두 개의 맵을 만드는 것에 대해 생각했습니다. 하나는 캡처가없는 모든 람다를위한 것이고 다른 하나는 다른 하나를위한 것입니다. 그런 다음 모든 클래스가 기본 클래스에서 상속되도록하고 벡터의 캡처 유형을 기본 클래스에 대한 포인터로 만들 수 있습니다. 그러나 이것은 매우 복잡하고 불필요한 오버 헤드를 추가하고 이것이 작동하는지조차 모릅니다. 이와 같은 상황에 대한 일반적인 해결책은 무엇입니까?

모든 답변과 안부 감사합니다.

Daniel Schreiber Mendes :)

편집 :
콜백은 이제 다음과 같이 보입니다.typedef std::function< void(sf::Event const&) > Callback;사용하고 싶을 때 :

//inside the Button Constructor
inputhandler.registerEvent(sf::Event::MouseButtonPressed, Callback([this](sf::Event const& event)
        {
            //memberFunc();
        }));

이것은 나에게 오류를주지는 않았지만 잘못된 방식으로 행동했습니다. 람다를 실행했지만 정의 된 클래스는 변경되지 않았습니다. 그래서 방금 생성 된 객체의 주소를 인쇄하는 라인을 생성자에 추가했습니다. Button을 하나만 만들고 있으므로 주소가 하나만 인쇄되어야합니다. 그러나 두 가지가있었습니다. 즉, std :: function에 래핑 된 람다를 벡터에 삽입하면 새 Button 객체가 생성됩니다. 어떻게 그렇게 될수 있니? 암시 적 객체 생성?

귀하의 답변에 감사드립니다 :)

앨런 버틀 스

캡처가있는 Lambda는 함수 포인터로 변환 할 수 없습니다. 일반 함수 포인터는 람다의 캡처를위한 상태를 저장할 곳이 없습니다.

std::function 객체이므로 캡처를 포함하거나 포함하지 않고 람다를 저장할 수 있습니다.

원시 함수 포인터를 사용해야하는 경우 함수 포인터와 상태를 저장 한 다음 호출 할 때 함수에 상태를 전달해야합니다. 예 :

typedef void(*Callback)(sf::Event const&, void* data);
std::unordered_map< sf::Event::EventType , std::vector< std::pair< Callback, void* > > > eventMap;

그런 다음 상태를 객체에 저장하고 객체를 어딘가에 저장하여 살아남 아야합니다. 개체 내부에서 void*다시 상태 개체 포인터 로 캐스팅해야합니다 . 일반 함수 포인터가 필요한 ac 라이브러리를 사용 std::function하지 않는 경우이 모든 작업을 수행하는 것이 훨씬 간단 합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C ++의 std :: function에 포함 된 람다 (캡처 중일 수 있음)를 고유하게 식별하는 방법

분류에서Dev

포인터에 캡처 된 매개 변수와 함께 람다를 저장하는 방법이 있습니다.

분류에서Dev

문자열의 일부를 벡터로 캡처하는 방법

분류에서Dev

이 C ++ 프로그램이 참조 segfault로 람다 인수를 캡처하는 이유는 무엇입니까?

분류에서Dev

포인터 벡터에 대한 for 루프 기반 C ++ 범위. const 참조로 요소를 캡처하는 방법은 무엇입니까?

분류에서Dev

c ++ 함수 (서브 루틴) 인수를 double 벡터 또는 int 벡터로 만드는 방법

분류에서Dev

C ++ | 서로 다른 클래스의 여러 객체를 포함하는 벡터를 만드는 방법

분류에서Dev

람다 함수를 사용한 벡터 정렬, 동일한 범위에 있지 않을 때 그룹을 캡처하기 위해 변수를 전달하는 방법은 무엇입니까?

분류에서Dev

함수 인수를 캡처하고 나중에 C ++ 11에서 실행하기 위해 함수 포인터를 저장하는 방법은 무엇입니까?

분류에서Dev

C ++ 클래스의 개인 멤버로 일반 함수 포인터를 얻는 방법은 무엇입니까?

분류에서Dev

함수 C ++에 대한 포인터의 스레드를 만드는 방법

분류에서Dev

다른 클래스의 인수 벡터로 사용할 함수 패밀리를 만드는 방법은 무엇입니까?

분류에서Dev

인수와 반환 유형을 알고 있다면 포인터를 사용하여 클래스 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

상수로 채워진 여러 열이있는 행을 캡처하는 Pandas 데이터 프레임

분류에서Dev

R의 벡터에서 함수 인수를 요소로 만드는 방법은 무엇입니까?

분류에서Dev

Java 클래스에서 함수 포인터를 효율적으로 만드는 방법은 무엇입니까?

분류에서Dev

이 람다가 포인터의 복사본을 캡처 할 수있는 방법이 있습니까?

분류에서Dev

JavaScript에서 자체 포인터로 고유 한 함수를 만드는 방법은 무엇입니까?

분류에서Dev

일반 람다에 대한 함수 포인터를 갖는 방법은 무엇입니까?

분류에서Dev

한 벡터의 요소와 다른 요소의 일치를 나타내는 벡터를 만드는 방법은 무엇입니까?

분류에서Dev

포인터로만 C 스타일 배열의 내용을 읽는 방법은 무엇입니까?

분류에서Dev

람다로 가변 인수를 캡처하여 내부 범위로 전달하는 방법

분류에서Dev

변수 인수와 변수 유형을 처리 할 수있는 C ++ 함수를 만드는 방법은 무엇입니까?

분류에서Dev

람다 함수 (람다 캡처 포함)를 std :: function 객체로 변환하는 템플릿

분류에서Dev

PhP에서 정수로 채워진 배열 간의 조인을 만드는 방법은 무엇입니까?

분류에서Dev

포인트 프리 스타일로 바인드 함수를 작성하는 방법은 무엇입니까?

분류에서Dev

오버로드 된 함수 모호성의 매개 변수로 람다 및 함수 포인터를 캡처하지 않음

분류에서Dev

문자열을 입력으로 받고 R에서 요일의 벡터를 반환하는 함수를 만드는 방법은 무엇입니까?

분류에서Dev

람다를 함수 포인터로 변환 할 때 내 C ++ 프로그램이 충돌하는 이유

Related 관련 기사

  1. 1

    C ++의 std :: function에 포함 된 람다 (캡처 중일 수 있음)를 고유하게 식별하는 방법

  2. 2

    포인터에 캡처 된 매개 변수와 함께 람다를 저장하는 방법이 있습니다.

  3. 3

    문자열의 일부를 벡터로 캡처하는 방법

  4. 4

    이 C ++ 프로그램이 참조 segfault로 람다 인수를 캡처하는 이유는 무엇입니까?

  5. 5

    포인터 벡터에 대한 for 루프 기반 C ++ 범위. const 참조로 요소를 캡처하는 방법은 무엇입니까?

  6. 6

    c ++ 함수 (서브 루틴) 인수를 double 벡터 또는 int 벡터로 만드는 방법

  7. 7

    C ++ | 서로 다른 클래스의 여러 객체를 포함하는 벡터를 만드는 방법

  8. 8

    람다 함수를 사용한 벡터 정렬, 동일한 범위에 있지 않을 때 그룹을 캡처하기 위해 변수를 전달하는 방법은 무엇입니까?

  9. 9

    함수 인수를 캡처하고 나중에 C ++ 11에서 실행하기 위해 함수 포인터를 저장하는 방법은 무엇입니까?

  10. 10

    C ++ 클래스의 개인 멤버로 일반 함수 포인터를 얻는 방법은 무엇입니까?

  11. 11

    함수 C ++에 대한 포인터의 스레드를 만드는 방법

  12. 12

    다른 클래스의 인수 벡터로 사용할 함수 패밀리를 만드는 방법은 무엇입니까?

  13. 13

    인수와 반환 유형을 알고 있다면 포인터를 사용하여 클래스 함수를 호출하는 방법은 무엇입니까?

  14. 14

    상수로 채워진 여러 열이있는 행을 캡처하는 Pandas 데이터 프레임

  15. 15

    R의 벡터에서 함수 인수를 요소로 만드는 방법은 무엇입니까?

  16. 16

    Java 클래스에서 함수 포인터를 효율적으로 만드는 방법은 무엇입니까?

  17. 17

    이 람다가 포인터의 복사본을 캡처 할 수있는 방법이 있습니까?

  18. 18

    JavaScript에서 자체 포인터로 고유 한 함수를 만드는 방법은 무엇입니까?

  19. 19

    일반 람다에 대한 함수 포인터를 갖는 방법은 무엇입니까?

  20. 20

    한 벡터의 요소와 다른 요소의 일치를 나타내는 벡터를 만드는 방법은 무엇입니까?

  21. 21

    포인터로만 C 스타일 배열의 내용을 읽는 방법은 무엇입니까?

  22. 22

    람다로 가변 인수를 캡처하여 내부 범위로 전달하는 방법

  23. 23

    변수 인수와 변수 유형을 처리 할 수있는 C ++ 함수를 만드는 방법은 무엇입니까?

  24. 24

    람다 함수 (람다 캡처 포함)를 std :: function 객체로 변환하는 템플릿

  25. 25

    PhP에서 정수로 채워진 배열 간의 조인을 만드는 방법은 무엇입니까?

  26. 26

    포인트 프리 스타일로 바인드 함수를 작성하는 방법은 무엇입니까?

  27. 27

    오버로드 된 함수 모호성의 매개 변수로 람다 및 함수 포인터를 캡처하지 않음

  28. 28

    문자열을 입력으로 받고 R에서 요일의 벡터를 반환하는 함수를 만드는 방법은 무엇입니까?

  29. 29

    람다를 함수 포인터로 변환 할 때 내 C ++ 프로그램이 충돌하는 이유

뜨겁다태그

보관