TL; DR: да.
Шаблоны C ++ действительно отличаются от общих типов c (особенно в Rust). Первый работает путем подстановки, не копаясь в типе во время определения элемента, а только во время использования . Итак, я считаю, что в C ++ можно создать шаблонный элемент, который в то же время компилируется и не может иметь экземпляр из-за конфликтующих требований.
Это не относится к типам generi c в Rust , они проверяются, когда вы определяете общий элемент c, например, T
в fn f<T>(..) {..}
. Таким образом, компилятор анализирует все случаи использования типа T
и его экземпляров, чтобы они использовались правильно.
В общем, да, вам нужно иметь свойство, привязанное к использованию методов типов. Что касается вашего случая, это может быть предпочтительным решением:
trait Hello {
fn say_hello();
}
impl Hello for A {
fn say_hello() {
A::hello()
}
}
impl Hello for B {
fn say_hello() {
B::hello()
}
}
Если вы хотите иметь поведение, подобное шаблонам в C ++, вы можете взглянуть на макросы :
macro_rules! say_hello {
($t:ty) => {{
<$t>::hello()
}}
}
fn main() {
say_hello!(A);
say_hello!(B);
}