Develog
템플릿 클래스의 람다식 형식 추론 본문

1. 템플릿
템플릿은 C++에서 제네릭을 구현하기 위해 사용되는 문법입니다.
타입을 고정시키지 않고 경우에 따라 다양한 타입의 값을 받아 동작시킬 수 있기 때문에 보다 유연하고, 재사용성이 높은 코드를 작성하는 것이 가능해집니다.
template <typename T>
struct AutoBrake {
AutoBrake(const T& publish) : publish{ publish } {}
void observe(const SpeedUpdate& cd) {}
void observe(const CarDetected& cd) {}
void set_collision_threshold_s(double x) {
collision_threshold_s = x;
}
double get_speed_mps() const {
return speed_mps;
}
private:
double collision_threshold_s;
double speed_mps;
const T& publish;
};
2. 타입 추론
템플릿으로 구현된 제네릭 클래스, 제네릭 함수 등을 사용할 때는 < > 기호를 사용하여 현재 사용하고자 하는 타입을 명시해 주는 것이 일반적입니다.
하지만 C++도 업데이트를 거치며 해당 타입을 따로 명시하지 않아도 추론을 통해 자동으로 타입을 대입해 사용하는 것이 가능해졌습니다.
다만 타입 추론의 허용 범위가 버전이 업데이트되면서 조금씩 바뀌었기 때문에 자신의 컴파일러 버전에 맞게 문법을 확인할 필요가 있습니다.
#19. [모던 C++] 개선된 템플릿(C++11, C++14, C++17, C++20)
(C++11~) extern으로 템플릿 선언을 할 수 있으며, 템플릿 인스턴스 중복 생성을 없앨 수 있습니다. (C++11~) 템플릿 오른쪽 꺽쇠 괄호 파싱을 개선하여 템플릿 인스턴스화시 >가 중첩되어 >>와 같이 되
tango1202.github.io
2.1. C++ 17 이전
void initial_speed_is_zero() {
AutoBrake<std::function<void(const BrakeCommand&)>> auto_brake{ [](const BrakeCommand&) {} };
assert_that(auto_brake.get_speed_mps() == 0L, "speed not equal 0");
}
함수 템플릿만 인수를 추론할 수 있고, 클래스 템플릿은 인수를 추론할 수 없습니다.
이 때문에 위 코드와 같이 AutoBrake 클래스를 사용할 때 타입을 명시적으로 작성해주어야 합니다.
2.2. C++ 17 이후
void initial_speed_is_zero() {
AutoBrake auto_brake{ [](const BrakeCommand&) {} };
assert_that(auto_brake.get_speed_mps() == 0L, "speed not equal 0");
}
C++ 17 이후부터는 인수 추론이 가능해지므로 위와 같이 타입을 따로 명시하지 않아도 됩니다.
(다만 Apple Clang 17 버전을 사용하고 있음에도 컴파일러가 위와 같은 코드에 대해 타입을 명시해야 한다는 에러를 발생시켰기 때문에 플랫폼마다 또 차이가 발생하는 것으로 보입니다)
수고하셨습니다!
'Technology > C++' 카테고리의 다른 글
| catch2, Undefined symbols for architecture 에러 극복기 (0) | 2025.08.25 |
|---|---|
| const와 constexpr (0) | 2025.08.06 |
| C++의 포인터 (0) | 2025.08.03 |
| static_assert와 non-type template (0) | 2025.07.30 |
| strcpy() 와 strncpy() (0) | 2025.07.14 |