[RUST vs C++] 15. Generic과 Template
https://google.github.io/comprehensive-rust/generics.html
Generics - Comprehensive Rust 🦀
This segment should take about 40 minutes. It contains: SlideDuration Generic Functions5 minutes Generic Data Types10 minutes Trait Bounds10 minutes impl Trait5 minutes Exercise: Generic min10 minutes
google.github.io
C++에서 어떤 값을 더한다고 하자.
int add(int a, int b);
=> 3 + 4는 가능.
=> "Hello" + ", World"는 안 됨.
그러면 우리는 string add(std::string a, std::string b); 이렇게 해서 받을 것이다.
근데 어쨌든 둘다 return a + b인건 맞다.
그래서 이렇게 타입이 다른걸 하지 않기 위해 C++에선 Template를 쓴다.
template<class T>
T add(T a, T b); 이런 식으로.
*여담으로, SFINAE라는 것을 아시나요?
"추론 실패는 오류가 아니다." 이거 한번 공부해 보시길..
- C++에서의 Template가 Rust에선 Generic이다.
*다른 언어에서도 Generic이라 한다. C++만 Template라 함.
15.1 Generic Functions
이런 식으로 Generic이 가능하다.
🎁 컴파일 단계에서 이 T부분의 타입을 알 수 있기 때문!
15.2 Generic Data Types
Generic의 경우, 방금은 함수였지만 구조체에도 이를 쓸 수 있다.
=> 이렇게 impl에선 옆에 <T>를 붙여주는 것이 약속이다.
**C++에선 Template에 여러 타입을 넣을 수 있다.
template <typename T1, typename T2>
___ add (T1 a, T2 b){
return a + b;
}
=> 여기서 return type은??
일단 int + double = double이다.
왜냐면 int가 double로 "암시적 형변환" 또는 "promotion(=승격)" 되기 때문.
어쨌든 우리는 T1 + T2 인 형태를 반환하길 원하니까, C++11에서부터 "decltype"이란 것을 내놓았다.
"decltype(T1 + T2)" add (T1 a, T2 b){
return a + b;
}
Rust에선 어떻게 적을까?
=> Rust에선 이런 상황 자체가 있을 수 없다. 타입이 서로다른 것들이 더해지는 것 자체가 불가능.
15.3 Generic Traits
이번엔 Traits이다.
B라는 것의 Type을 A로 바꾸고 싶다면, from을 통한 Trait을 구현하면 되고,
이 A를 또 다른 Type인 C로 또 바꾸고 싶다면, 여기선 into를 써야 한다.
15.4 Trait Bounds - 15.5 impl Trait
- template 중급 내용.
우린 보통 template <typename T>를 쓴다.
여기서 이 T에 제약을 걸어보자. 예를 들어, T는 수치 타입만 받도록 하는 것.
이를 위해 TypeTraits라는 것을 둔다.
위의 식 add_42_millions은 들어오는 값에 대해 제약을 둔 것.
아래의 식 pair_of는 return 값에 대해 제약을 둔 것.