BETA

C++에서 함수 포인터와 객체의 bind

#C++
장현우

2025.03.04
3분

41명

개요

함수 포인터. 이건 C에도 존재하는 고대 기술입니다.
말 그대로 함수를 가르키는 놈이에요.
일반 포인터가 그 주소에 있는 값에 마음대로 접근할 수 있듯이 함수 포인터도 그 함수를 실행시킬 수 있습니다.
안타깝게도 함수 내부를 뜯어 고치는건 불가능하지만요.

이 함수 포인터가 가르킬 수 있는건 진짜 모든 함수입니다.
단순한 전역 함수부터 정적 함수, 클래스 내부에 존재하는 멤버 함수까지요.

근데 이 클래스 내부에 존재하는 멤버 함수는 대체 어떻게 가르키고 있길래 얘를 실행할 수 있는걸까요?

바인딩

사실 저도 모릅니다! 근데 추측은 해볼 수 있죠.

기본적으로 클래스는 함수를 가지고 있지 않습니다.
그러니까 멤버함수는 객체와 바인딩 되어있지 않아요.
일반 정적 함수나 전역 함수처럼 저 메모리 공간 어딘가를 둥둥 떠다닙니다.

그리고 이 함수들이 실행될땐 암묵적으로 첫번째 매개변수로 객체를 넘겨주는 겁니다.
멤버 변수들은 모두 this 포인터를 통해 접근되는것이죠.

이걸 통해서 살짝의 응용을 해줄 수 있어요.
어떠한 객체 A가 있고 멤버함수가 있는데 내가 A배열 내부에서 주체만 바꿔서 특정 멤버 함수를 그냥 쭉 실행시키고 싶다면 해당 함수 포인터를 저장한다음에 std::bind라는 함수를 통해서 객체와 함수를 순서대로 바인딩 해서 실행시켜주면 됩니다.
물론 이럴 빠에 그냥 실행하고 말겠지만 조금 더 확장성 있게 내가 직접 함수를 지정해주고 싶을수도 있잖아요? 그때 사용하는겁니다.

대체 언제 쓰나 싶겠지만 전 실제로 사용중입니다.

이런식으로 함수 포인터를 전달해서
image


이런식으로 객체를 싹 뒤져가며 bind 시키고 실행 시키는거죠.
image


그냥 갑자기 보이길래 뻘글 하나 썼어요.

잏잏잏 << 이거 폰트 잘깨지네요.

댓글 1

도미
2025.03.04
개쩌는 c++ 바인딩 방법 잘 봤어요 😁😁😁 js에서도 비슷한 bind, call, apply 함수가 있지요 폰트는 나중에 바꿔볼게요..