# Overloading [github](https://github.com/George-Miao/overloading) [crates.io](https://crates.io/crates/overloading) [docs.rs](https://docs.rs/overloading) A POC crate that utilizes `Fn*` traits to implement partial overloading. Caveat: only parameters can be overloaded, not return types. ## TLDR ```rust #![feature(unboxed_closures)] #![feature(fn_traits)] use overloading::overloading; #[overloading] fn overloaded(abc: String) -> i32 { abc.parse().unwrap() } #[overloading(overloaded)] fn overloaded() -> i32 { 114514 } #[test] fn test() { let res = overloaded("123".to_owned()); assert_eq!(res, 123); let res = overloaded(); assert_eq!(res, 114514); } ``` Expanded code: ```rust #[allow(non_camel_case_types)] struct overloaded; impl std::ops::FnOnce<(String,)> for overloaded { type Output = i32; extern "rust-call" fn call_once(self, (abc,): (String,)) -> Self::Output { abc.parse().unwrap() } } impl std::ops::FnMut<(String,)> for overloaded { extern "rust-call" fn call_mut(&mut self, (abc,): (String,)) -> Self::Output { abc.parse().unwrap() } } impl std::ops::Fn<(String,)> for overloaded { extern "rust-call" fn call(&self, (abc,): (String,)) -> Self::Output { abc.parse().unwrap() } } impl std::ops::FnOnce<()> for overloaded { type Output = i32; extern "rust-call" fn call_once(self, _: ()) -> Self::Output { 114514 } } impl std::ops::FnMut<()> for overloaded { extern "rust-call" fn call_mut(&mut self, _: ()) -> Self::Output { 114514 } } impl std::ops::Fn<()> for overloaded { extern "rust-call" fn call(&self, _: ()) -> Self::Output { 114514 } } ```