Published in
2 min readApr 24, 2020
C++ 사용자는 다음과 같은 코드를 작성할 수 있다.
template<class T, int length>
struct my_vec {
std::array<T, length> inner_data;
...
};
int main() {
my_vec<float, 42> some_vec;
}
여기서 inner_data
배열의 크기는 제너릭 파라메터 length
로 정해진다.
러스트에서도 이 것과 비슷한 코드를 작성할 수 있다. 러스트의 이 기능은 아직 해결되어야 할 이슈가 남아 있어서 완전하게 동작하지는 않지만 nightly 컴파일러에서 이 기능을 일부 구현하고 있다.
러스트로 위 C++ 코드와 비슷한 코드는 다음과 같이 작성할 수 있다.
#![feature(const_generics)]
struct MyVec<T: Sized, const LENGTH: usize> {
inner_data: [T; LENGTH],
}
impl<T, const L: usize> MyVec<T, L> {
pub fn new(value: T) -> Self {
MyVec {
inner_data: [value; L],
}
}
}
fn main() {
let _my_vec = MyVec::<f64, 10>::new(4.2);
}
하지만 러스트 컴파일러는 다음과 같은 에러 메시지를 출력할 것이다.
error: array lengths can't depend on generic parameters
--> src/main.rs:11:33
|
11 | inner_data: [value; L],
|
이 글이 씌여지는 시점에서 러스트 컴파일러는 위 코드를 컴파일 하지 못하고 있다. 몇몇 이슈가 여전히 논의 중이고, 어서 이 기능이 안정화 되기를 바라는 마음이다.
이 이슈와 관련된 트랙킹은 여기를 보면 된다.