C++
표준 라이브러리의std::function
은 타입 소거(type erasure
) 기법을 통해 다양한 함수 객체를 저장하고 호출할 수 있는 유연한 래퍼(wrapper
) 입니다.- 하지만
C++11
에서는std::function::target_type()
의 반환값을 통한operator==
비교가 가능했으며, 이는 설계상 애매하고 잘못 사용될 소지가 있다는 지적을 받아 결국C++23
에서 제거되었습니다.
std::function::target_type()
은 함수 객체의 타입 정보를std::type_info
형태로 반환하지만, 이 타입 비교는typeid
비교와 다를 바 없고 코드의 명확성을 떨어뜨렸습니다.
std::function
은 내부 타입을 감추고 콜러블 호출만 보장하는 추상화 도구입니다.- 타입 비교는 타입 소거의 철학에 맞지 않으며 잘못된 설계 방향으로 여겨졌습니다.
std::type_info::operator==
비교는 컴파일러마다 구현 방식이 다를 수 있으며, 이로 인한 혼동을 방지하기 위해 제거되었습니다.
-
cpp
#include <iostream> #include <functional> #include <typeinfo> void func() { std::cout << "Hello\n"; } int main() { std::function<void()> f = func; // C++11에서는 이렇게 비교 가능 if (f.target_type() == typeid(void(*)())) { std::cout << "타겟 타입이 void(*)() 입니다.\n"; } return 0; }
-
output
타겟 타입이 void(*)() 입니다.
-
C++23
에서는operator==
비교가 제거되어 컴파일 에러가 발생합니다. -
cpp
#include <iostream> #include <functional> #include <typeinfo> void func() { std::cout << "Hello\n"; } int main() { std::function<void()> f = func; // C++23에서는 컴파일 오류 발생! if (f.target_type() == typeid(void(*)())) { std::cout << "타겟 타입이 void(*)() 입니다.\n"; } return 0; }
-
❌ 컴파일 에러 메시지 예시:
error: use of deleted function 'bool std::type_info::operator==(const std::type_info&) const = delete'
-
타입을 확인하고 싶다면
target<>()
를 사용하여 해당 타입으로 변환 가능한지 확인하는 방식이 권장됩니다. -
cpp
#include <iostream> #include <functional> void func() { std::cout << "Hello\n"; } int main() { std::function<void()> f = func; if (f.target<void(*)()>() != nullptr) { std::cout << "타겟 타입이 void(*)() 입니다.\n"; } return 0; }
-
출력:
타겟 타입이 void(*)() 입니다.
-
결론적으로
std::function::target_type::operator==
는 의미의 모호함, 타입 소거 철학 훼손, 구현 의존성을 이유로C++23
에서 삭제되었습니다. -
앞으로는
f.target<Foo>() != nullptr
형태로 타입 확인을 하는 것이 올바른 방식입니다.
- 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄
'C C++' 카테고리의 다른 글
C++ enum class에서 ++ 연산자 사용과 순환 처리 (0) | 2025.03.26 |
---|---|
wide-integer : C++ 큰 정수(integer) 라이브러리 (0) | 2025.03.25 |
C++20에서 std::tr1이 제거된 이유 (0) | 2025.03.24 |
C++20에서 std::result_of가 제거된 이유 (0) | 2025.03.24 |
C++20에서 std::allocator<void>가 제거된 이유 (0) | 2025.03.24 |