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;
fn은 Person 클래스의 멤버 함수 포인터입니다. 구체적으로는 int를 인자로 받아 void를 반환하는 print 함수를 가리킵니다.fn은 Person 클래스의 멤버 함수 print를 가리키는 포인터로 초기화됩니다.Person person;
(person.*fn)(1); // this를 넘겨줘야 함
person 객체를 생성한 후, 멤버 함수 포인터 fn을 사용하여 print 함수를 호출합니다.person.*fn 형태로 호출하며, 이를 통해 person 객체의 print 함수가 호출되고, 인자 1이 전달됩니다.typedef void (Person::* Func0)(int); // typedef 를 사용하여 간략히 표기
Func0 fn0 = &Person::print;
(person.*fn0)(2);
typedef를 사용하여 함수 포인터 타입을 정의합니다. 이제 Func0이라는 이름을 통해 Person 클래스의 멤버 함수 포인터 타입을 간단히 사용할 수 있습니다.fn0는 print를 가리키는 멤버 함수 포인터로 초기화되며, 이를 통해 print 함수를 호출합니다.using Func1 = void (Person::*)(int);
Func1 fn1 = &Person::print;
(person.*fn1)(3);
using 키워드를 사용하여 typedef와 같은 효과를 냅니다.fn1도 print를 가리키는 포인터로 초기화되어, person 객체의 print 함수가 호출됩니다.function<void(Person*, int)> fn2 = &Person::print;
fn2(&person, 4);
std::function을 사용하면 더 유연하게 멤버 함수를 포인터로 다룰 수 있습니다.fn2는 Person* 타입의 포인터와 int를 인자로 받아 void를 반환하는 함수 객체로, print 함수를 가리킵니다.fn2를 호출할 때 person 객체의 주소와 인자 4를 전달하여 print 함수를 호출합니다.void (*fn3)(int) = &Person::staticPrint;
fn3(5);
staticPrint는 일반 함수와 동일하게 다룰 수 있습니다.fn3는 staticPrint를 가리키는 일반 함수 포인터로 초기화되며, 이를 통해 staticPrint 함수를 호출하고, 인자 5를 전달합니다.C++에서는 특정 클래스의 멤버 함수를 가리키는 포인터를 사용할 수 있습니다. 멤버 함수 포인터는 객체 인스턴스를 통해 호출되며, person.*fn 또는 (person.*fn)(args) 형태로 호출됩니다. 이때 typedef 또는 using을 통해 멤버 함수 포인터 타입을 간단하게 정의할 수 있습니다.
std::function은 함수 포인터보다 더 유연하게 함수 호출을 캡슐화할 수 있는 도구입니다. 이를 통해 멤버 함수, 일반 함수, 람다 등을 같은 방식으로 호출할 수 있습니다.
정적 멤버 함수는 객체 인스턴스 없이도 호출할 수 있으며, 일반 함수 포인터로 다룰 수 있습니다.
이번 코드 예제를 통해 C++에서 멤버 함수 포인터와 std::function의 사용법을 알아보았습니다. 멤버 함수 포인터는 특정 객체의 멤버 함수를 호출할 때 유용하며, std::function을 통해 더욱 유연하게 함수를 다룰 수 있습니다. 정적 멤버 함수는 객체 인스턴스와 무관하게 호출할 수 있다는 점에서 일반 함수와 유사합니다.