Вот примеры для Rust://Обобщенные функции Fmul и Fplus
use std::ops::Add;
fn Fmul<T>(x:T, y:T) -> T::Output
where T: std::ops::Mul // для типов, реализующих трейт Умножение
{ x * y }
#[derive(Debug,Copy,Clone)]
struct Point {
x:i32,
y:i32,
}
impl Add for Point {
type Output = Self;
fn add(self, p2: Self) -> Self {
Self {x: self.x + p2.x, y: self.y + p2.y}
}
}
#[derive(Debug,Clone)]
struct WrappedString {
s:String,
}
impl Add for WrappedString {
type Output = Self;
fn add(self, s2: Self) -> Self {
Self {s: self.s + &s2.s}
}
}
fn Fplus<T>(x:T, y:T) -> T::Output
where T: std::ops::Add // для всех типов, реализующих трейт Сложение
{ x + y }
fn main(){
let i1:i32 = -3;
let i2:i32 = 4;
println!("{:?}", Fmul(&i1,&i2));
let u1:u32 = 30;
let u2:u32 = 40;
println!("{:?}", Fmul(&u1,&u2));
let p1 = Point{x: 3, y: 4};
let p2 = Point{x: 5, y: 6};
let s1 = WrappedString{s:"Склей".to_string()};
let s2 = WrappedString{s:"ка".to_string()};
println!("{:?}", Fplus(p1,p2));
println!("{:?}", Fplus(s1,s2).s);
println!("{:?}", "Склей".to_string()+"ка");
println!("{:?}", Fplus(&u1,&u2));
}