Можно ли управлять размером массива с помощью параметра типа общего?

Далее следует только пример и недопустимый код Rust.

struct Vec<T: Sized, Count> {
    a: [T; Count]
}

Что-то вроде этого возможно в шаблонах С++, но я не видел его в Rust.

Ответ 1

Эта способность еще не доступна. RFC 2000 - const generics будет поддерживать его, когда он будет реализован, и прогресс отслеживается в выпуске # 44580.

В Nightly Rust ваш пример будет выглядеть так:

#![feature(const_generics)]

struct Vec<T: Sized, const COUNT: usize> {
    a: [T; COUNT],
}

Если вы посмотрите на дизайн Rust, вы заметите, что он начался сначала с решения самых сложных проблем (безопасных для памяти, без гонки данных), но в остальном есть много областей, где он "неполон" (по сравнению с тем, что может быть достигнута).

В частности, общие структуры и функции сегодня несколько ограничены:

  • отсутствие Высших Родовых Типов (HKT)
  • отсутствие нетиповых параметров => массивы имеют специальный случай, и реализация свойства для массива является известной проблемой, обходной путь состоит в том, чтобы реализовать его для нескольких различных измерений
  • отсутствие переменных параметров => кортежи имеют специальный случай, и реализация черты для всех кортежей также сложна

На данный момент они не реализованы не потому, что они нежелательны, а просто потому, что времени не хватало. Идея Rust 1.0 заключалась не в выпуске конечного продукта, который не будет развиваться, а в стабильной основе, с которой можно начать; некоторые или, возможно, все придут.

Ответ 2

В ожидании Rust, чтобы получить первоклассную поддержку для этого, есть ящики, которые предоставляют определенные уровни этой функциональности, такие как: