Реализация трейта включает в себя реализацию поведения, которое зависит от типа c и отдельно от других реализаций («ad ho c»), и которое может быть вызвано с тем же написанием при вызове - site как другие реализации («полиморфи c»). Это в том же направлении, что и перегрузка функций.
В C ++ вы можете предоставить перегрузки для достижения ad ho c полиморфизма:
void foo(const X&) { ... }
void foo(const Y&) { ... }
// can call foo(z) where z is an X or a Y
И вы можете сделать то же самое с трейтами в Rust :
trait Foo { fn foo(); }
impl Foo for X { ... }
impl Foo for Y { ... }
// can call z.foo() where z is an X or a Y
«Другое направление», о котором я думаю, вы имеете в виду, - это возможность ограничивать обобщенные типы тем, какое поведение они поддерживают. В Rust это выглядит так:
fn bar<T: Foo>(t: T) { ... }
// bar can use t.foo()
С ++ имеет аналогию:
template<typename T> concept Foo = requires(T t) { foo(t); };
void bar(Foo auto& t) { ... }
// bar can use foo(t)
// (this uses really new C++, it's written differently in older C++)
Ограниченные общие c функции не являются специальным c полиморфизмом, потому что у них есть одна реализация, которая применяется ко всем типам аргументов, которые реализуют любые предъявляемые к ним требования. достичь тех же целей. Специальный полиморфизм c в C ++ обычно достигается с помощью перегрузки функций. Этого также можно достичь с помощью специализации шаблона.