// 定义trait
trait MathOperation<T> {
fn operate(&self, a: T, b: T) -> T;
}
// 使用函数指针调用operate方法
fn apply_operation<T, F>(op: &F, a: T, b: T) -> T
where
F: MathOperation<T>,
{
(op.operate)(a, b)
}
// 加法结构体
struct Add;
impl<T: std::ops::Add<Output = T>> MathOperation<T> for Add {
fn operate(&self, a: T, b: T) -> T {
a + b
}
}
// 乘法结构体
struct Multiply;
impl<T: std::ops::Mul<Output = T>> MathOperation<T> for Multiply {
fn operate(&self, a: T, b: T) -> T {
a * b
}
}
fn main() {
let add = Add;
let multiply = Multiply;
// 对i32类型应用操作
let result_i32_add = apply_operation(&add, 5i32, 3i32);
let result_i32_multiply = apply_operation(&multiply, 5i32, 3i32);
println!("i32加法结果: {}", result_i32_add);
println!("i32乘法结果: {}", result_i32_multiply);
// 对f64类型应用操作
let result_f64_add = apply_operation(&add, 5.0f64, 3.0f64);
let result_f64_multiply = apply_operation(&multiply, 5.0f64, 3.0f64);
println!("f64加法结果: {}", result_f64_add);
println!("f64乘法结果: {}", result_f64_multiply);
}