일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Rust
- 백준
- column space
- rust 스터디
- 행렬
- CS정리
- unity
- 컴파일러
- 대상파일
- linear algebra
- 정적링크
- 코드포스
- matrix
- 벡터
- 다이나믹 프로그래밍
- 컴퓨터밑바닥의비밀
- 심벌 해석
- 재배치
- c++
- 알고리즘
- eigenvalue
- vector
- 구문트리
- 스레드전용리소스
- 다익스트라
- 링커
- 선형대수학
- 적재도구loader
- 스레드전용저장소
- 동적링크
- Today
- Total
개발_기록용
[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 값에 대해 제약을 둔 것.
'RUST 스터디' 카테고리의 다른 글
RUST 스터디[RUST vs C++] 13. Methods and Traits (1) | 2024.05.15 |
---|---|
RUST 스터디[RUST vs C++] 12. Pattern Matching (0) | 2024.05.13 |
RUST 스터디[RUST vs C++] 10. User-Defined Types (0) | 2024.05.13 |
[RUST vs C++] 17. Standard Library Traits (0) | 2024.05.13 |
[RUST vs C++] 16. 표준 라이브러리 (2) | 2024.05.12 |