개발_기록용

[RUST vs C++] 15. Generic과 Template 본문

RUST 스터디

[RUST vs C++] 15. Generic과 Template

나폴나폴 2024. 5. 12. 23:31
728x90

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 값에 대해 제약을 둔 것.

반응형
Comments