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
을 통해 더욱 유연하게 함수를 다룰 수 있습니다. 정적 멤버 함수는 객체 인스턴스와 무관하게 호출할 수 있다는 점에서 일반 함수와 유사합니다.