본문 바로가기
프로그래밍/C++

C++ ] 멤버 함수 포인터 사용하기 / 함수포인터 대신 std::function 사용 / using으로 별칭 사용

by eteo 2023. 9. 15.

 

 

 

 

멤버 함수 포인터 선언

 

returnType (className::*pointerName)(parameterTypes);

 

 

 

멤버 함수 포인터에 함수 주소 대입하기

 

멤버 함수 포인터에 함수 주소를 대입할 때는 일반 함수포인터와는 다르게 & 연산자를 생략할 수 없다.

 

returnType (className::*pointerName)(parameterTypes) = &className::memberFunctionName;

 

 

 

 

멤버 함수 포인터 호출하는 법

 

className object; // 클래스의 인스턴스 생성
(returnType)(object.*pointerName)(arguments);

 

만약 클래스의 멤버인 멤버 함수 포인터를 멤버 함수 내에서 호출한다면 아래처럼 하면 된다.

 

(this->*functionPointer)();

 

 

 

 

 

사용 예시.

 

#include <iostream>

class MyClass {
public:
    void PrintHello() {
        std::cout << "Hello, world!" << std::endl;
    }
};

int main() {
    MyClass obj;
    void (MyClass::*functionPointer)() = &MyClass::PrintHello;

    (obj.*functionPointer)(); // 멤버 함수 포인터를 사용하여 PrintHello 호출

    return 0;
}

 

 

 

 

 

 

 

 

typedef 대신 using 사용해 함수포인터 타입 별칭 만들기

 

 

typedef void (*FunctionPointer)(int, double);
using FunctionPointer = void(*)(int, double);

 

 

 

함수 포인터 대신 std::function을 사용하는 방법

 

std::function 사용하는 방법이다. functioanl 헤더를 포함시켜야 한다.

 

std::function<반환타입(인수..)> 함수포인터명 

 

 

#include <iostream>
#include <functional>

void PrintMessage(const std::string& message) {
    std::cout << message << std::endl;
}

int Add(int a, int b) {
    return a + b;
}

int main() {
    std::function<void(const std::string&)> printer = PrintMessage;
    std::function<int(int, int)> adder = Add;

    printer("Hello, world!"); // PrintMessage 함수 호출
    int result = adder(3, 4);   // Add 함수 호출

    return 0;
}

 

 

 

 

 

 

그리고 함수포인터 대신 function을 쓰면 가장 좋은 이유는 람다식과 같이 사용하면 멤버함수도 담을 수 있다는 것이다!

 

#include <iostream>
#include <functional>

class Some {
    public:
    void PrintMessage(const std::string& message) {
        std::cout << message << std::endl;
    }   
};

int main() {
    
    Some some;
    
    // std::function<void(const std::string&)> printer = &Some::PrintMessage; 안됨
    std::function<void(const std::string&)> printer = [&some](const std::string x){
        some.PrintMessage(x);
    };

    printer("Hello, world!");

    return 0;
}