C++에서 std::function의 사용법은?
_____A1: std::function은 C++11부터 도입된 함수 포인터를 일반화한 객체로, 함수, 람다, 함수 객체(펑터), 멤버 함수 등을 보관하고 호출할 수 있는 가변적인 함수 래퍼입니다.
Q2: std::function을 선언하는 기본 문법은 어떻게 되나요?
A2:
```cpp
std::function<리턴타입(매개변수 형식들)> 변수명;
```
예:
```cpp
std::function
```
Q3: std::function에 함수나 람다를 할당하는 방법은?
A3:
- 함수 포인터 대입
```cpp
int add(int a, int b) { return a + b; }
std::function
```
- 람다 대입
```cpp
std::function
```
- 함수 객체 대입
```cpp
struct Add { int operator()(int a, int b) { return a + b; } };
std::function
```
Q4: std::function을 호출하는 방법은?
A4: 함수 호출 연산자 operator()를 사용합니다.
```cpp
int result = func(2, 3);
```
Q5: std::function은 어떤 경우에 유용한가요?
A5:
- 다양한 종류의 콜러블 객체를 하나의 타입으로 다뤄야 할 때
- 콜백 함수, 이벤트 핸들러, 함수 저장과 전달 시
- 템플릿 함수나 클래스가 아닌 일반 코드에서 함수 호출 방법을 추상화할 때
Q6: std::function의 내부 동작 방식은?
A6: 내부적으로 타입 소거(type erasure) 기법을 이용하며, 콜러블 객체의 복사와 호출 인터페이스를 숨겨 일반화된 호출이 가능합니다.
Q7: std::function의 기본 초기화 값은?
A7: 기본 생성 시 안에 콜러블이 없는 상태이며, 호출하면 std::bad_function_call 예외가 발생합니다.
안전하게 호출하려면 bool 형 변환 또는 operator bool()으로 존재 여부 확인 가능:
```cpp
if (func) { func(...); }
```
Q8: 멤버 함수도 std::function에 저장할 수 있나요?
A8: 직접 멤버 함수 포인터만 대입할 경우 호출 시 객체가 필요합니다. 일반적으로 std::bind나 람다를 사용해 객체와 함께 묶어야 합니다.
예:
```cpp
class A {
public:
void foo(int x) { /*...*/ }
};
A a;
std::function
// 또는
std::function
```
Q9: std::function의 성능 문제는 없나요?
A9: std::function은 함수 포인터보다 저장 및 호출 시 약간의 오버헤드가 있으며, 내부적으로 메모리 할당이 발생할 수 있습니다. 성능이 중요한 경우 std::function 대신 템플릿을 권장합니다.
Q10: std::function에 가변 인자를 가진 함수도 저장할 수 있나요?
A10: std::function은 고정된 함수 시그니처만 지원하므로 가변 인자를 가진 함수는 직접 저장할 수 없습니다. 가변 인자 함수는 반드시 구체적인 시그니처를 갖도록 래핑해야 합니다.
Q11: std::function과 std::bind는 어떤 관계인가요?
A11: std::bind는 함수 호출 인자를 미리 고정시켜 새로운 호출 객체를 만듭니다. 이 호출 객체를 std::function에 저장해 호출할 수 있습니다.
Q12: std::function의 복사, 이동 가능 여부는?
A12: std::function은 복사 및 이동 생성자/대입 연산자를 지원합니다. 내부 콜러블 객체 역시 복사 가능해야 합니다.
Q13: std::function 사용 시 주의점은?
A13:
- 내부에 저장된 콜러블이 복사 가능해야 함
- 호출 전에 함수 유효성 체크(if (func))
- 무거운 호출이 있을 수 있으므로 성능 검토 필수
- 람다 캡처나 바인딩한 객체의 수명 관리를 명확히 해야 함
---
이상입니다. std::function은 C++에서 다양한 함수 호출을 추상화할 때 매우 편리한 도구입니다.
작성자:
정재원 [비회원]
| 작성일자: 1년 전
2024-09-20 17:11:33
조회수: 145 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 145 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.