프로그래밍 일반/C++ 프로그래밍
[C++] std::function
지노윈
2020. 9. 10. 23:40
반응형
C++11표준 라이브러리의 한 템플릿으로, 함수 포인터 개념을 일반화한 것입니다. 함수 포인터는 함수만 가리킬 수 있지만 std::function은 호출 가능한 객체이면 그 어느 것도 가리킬 수 있습니다. 즉, 함수 처럼 호출 할 수 있는 것이면 그 무엇이라도 std::function으로 가리킬 수 있습니다.
예를 들면 함수, operator(), 람다 함수들이 있으며 다음은 그 예시입니다.
int sum(int a, int b) {
return a + b;
}
struct Sum {
int operator()(int a, int b) { return a + b; }
};
int main() {
std::function<int(int, int)> s1 = sum;
std::function<int(int, int)> s2 = Sum();
std::function<int(int, int)> s3 = [](int a, int b) -> int { return a + b; };
std::cout << s1(1, 2) << std::endl;
std::cout << s2(1, 2) << std::endl;
std::cout << s3(1, 2) << std::endl;
}
멤버 변수를 참조하는 경우는 사용방법이 조금 다릅니다.
class TwoNum {
int a = 1;
int b = 2;
public:
int sum() { return a + b; }
};
int main() {
TwoNum a;
std::function<int()> s1 = a.sum;
s1();
}
위 코드는 다음과 같은 컴파일 오류가 발생합니다.
error C3867: 'TwoNum::sum': 비표준 구문입니다. '&'를 사용하여 멤버 포인터를 만드세요.
이유는 s1을 호출 했을때 a + b에서 어떤 객체 인스턴스의 a와 b인지 모르기 때문입니다.
이럴땐, 멤버 변수를 참조하는 경우에는 다음과 같이 std::function을 사용하면 됩니다.
class TwoNum {
int a = 1;
int b = 2;
public:
int sum() { return a + b; }
};
int main() {
TwoNum a;
std::function<int(TwoNum&)> s2 = &TwoNum::sum;
s2(a);
}