Я новичок в Rust. Я хочу, чтобы тип зависел от постоянного универсального параметра в Rust. В C++ этого легко добиться с помощью метапрограммирования:
Код: Выделить всё
template
struct MyStruct {
using MyType = char const *;
};
template
struct MyStruct {
using MyType = std::int8_t;
};
template
struct MyStruct {
using MyType = std::int16_t;
};
Я пробовал сделать нечто подобное в Rust:
Код: Выделить всё
trait MyTrait {
type MyType;
}
struct MyStruct;
impl MyTrait for MyStruct {
type MyType = str;
}
impl MyTrait for MyStruct {
type MyType = i8;
}
impl MyTrait for MyStruct {
type MyType = i16;
}
Это не работает. Компилятор говорит:
Код: Выделить всё
...
conflicting implementations of trait `MyTrait` for type `MyStruct`
...
conflicting implementations of trait `MyTrait` for type `MyStruct`
...
Я ожидал, что Rust поймет, что первая универсальная реализация MyStruct — это только случай по умолчанию, когда он не может рассчитывать ни на один другой, как это имеет место в C++. Я провел небольшое исследование, и кажется, что есть способ заставить его работать, явно ограничивая значения N, для которого определена первая универсальная реализация, но для этого требуется включить экспериментальную функцию из ночной сборки компилятора. Однако я ищу способ сделать это с помощью последней стабильной версии компилятора без включения каких-либо экспериментальных функций. Есть ли способ сделать это или Rust по своей сути ограничен в метапрограммировании по сравнению с C++?
РЕДАКТИРОВАТЬ: Я понимаю, что невозможно добиться того, чего я хочу, в стабильном компиляторе.
Подробнее здесь:
https://stackoverflow.com/questions/798 ... er-in-rust