C++에서의 멤버 함수 포인터와 std::function 사용 예제

클래스 정의

class Person
{
public:
    void print(int i)
    {
        cout << i << endl;
    }

    static void staticPrint(int i)
    {
        cout << i << endl;
    }
};
  • Person 클래스는 print라는 멤버 함수와 staticPrint라는 정적 멤버 함수를 포함합니다.
  • print 함수는 객체의 인스턴스를 통해서만 호출할 수 있는 멤버 함수입니다.
  • staticPrint 함수는 정적 함수로, 객체 인스턴스를 생성하지 않고도 호출할 수 있습니다.

멤버 함수 포인터 사용

void (Person::*fn)(int) = &Person::print;
  • fnPerson 클래스의 멤버 함수 포인터입니다. 구체적으로는 int를 인자로 받아 void를 반환하는 print 함수를 가리킵니다.
  • fnPerson 클래스의 멤버 함수 print를 가리키는 포인터로 초기화됩니다.
Person person;
(person.*fn)(1); // this를 넘겨줘야 함
  • person 객체를 생성한 후, 멤버 함수 포인터 fn을 사용하여 print 함수를 호출합니다.
  • person.*fn 형태로 호출하며, 이를 통해 person 객체의 print 함수가 호출되고, 인자 1이 전달됩니다.

typedef와 using을 사용한 간소화

typedef void (Person::* Func0)(int); // typedef 를 사용하여 간략히 표기
Func0 fn0 = &Person::print;
(person.*fn0)(2);
  • typedef를 사용하여 함수 포인터 타입을 정의합니다. 이제 Func0이라는 이름을 통해 Person 클래스의 멤버 함수 포인터 타입을 간단히 사용할 수 있습니다.
  • fn0print를 가리키는 멤버 함수 포인터로 초기화되며, 이를 통해 print 함수를 호출합니다.
using Func1 = void (Person::*)(int);
Func1 fn1 = &Person::print;
(person.*fn1)(3);
  • using 키워드를 사용하여 typedef와 같은 효과를 냅니다.
  • fn1print를 가리키는 포인터로 초기화되어, person 객체의 print 함수가 호출됩니다.

std::function을 사용한 함수 포인터

function<void(Person*, int)> fn2 = &Person::print;
fn2(&person, 4);
  • std::function을 사용하면 더 유연하게 멤버 함수를 포인터로 다룰 수 있습니다.
  • fn2Person* 타입의 포인터와 int를 인자로 받아 void를 반환하는 함수 객체로, print 함수를 가리킵니다.
  • fn2를 호출할 때 person 객체의 주소와 인자 4를 전달하여 print 함수를 호출합니다.

정적 멤버 함수 호출

void (*fn3)(int) = &Person::staticPrint;
fn3(5);
  • 정적 멤버 함수 staticPrint는 일반 함수와 동일하게 다룰 수 있습니다.
  • fn3staticPrint를 가리키는 일반 함수 포인터로 초기화되며, 이를 통해 staticPrint 함수를 호출하고, 인자 5를 전달합니다.

전반적인 설명 및 정리

멤버 함수 포인터

C++에서는 특정 클래스의 멤버 함수를 가리키는 포인터를 사용할 수 있습니다. 멤버 함수 포인터는 객체 인스턴스를 통해 호출되며, person.*fn 또는 (person.*fn)(args) 형태로 호출됩니다. 이때 typedef 또는 using을 통해 멤버 함수 포인터 타입을 간단하게 정의할 수 있습니다.

std::function 사용

std::function은 함수 포인터보다 더 유연하게 함수 호출을 캡슐화할 수 있는 도구입니다. 이를 통해 멤버 함수, 일반 함수, 람다 등을 같은 방식으로 호출할 수 있습니다.

정적 멤버 함수

정적 멤버 함수는 객체 인스턴스 없이도 호출할 수 있으며, 일반 함수 포인터로 다룰 수 있습니다.


결론

이번 코드 예제를 통해 C++에서 멤버 함수 포인터와 std::function의 사용법을 알아보았습니다. 멤버 함수 포인터는 특정 객체의 멤버 함수를 호출할 때 유용하며, std::function을 통해 더욱 유연하게 함수를 다룰 수 있습니다. 정적 멤버 함수는 객체 인스턴스와 무관하게 호출할 수 있다는 점에서 일반 함수와 유사합니다.

profile
李家네_공부방

0개의 댓글