В результате обсуждения в мэйл-листе Rust вопроса о перегрузке функций, родился еще один довольно занятный вариант:
enum input { int(int), str(str) }
iface to_input { fn to_input() -> input; }
impl of to_input for int { fn to_input() -> input { ret int(self); } }
impl of to_input for str { fn to_input() -> input { ret str(self); } }
fn to_input<T: to_input>(t: T) {
alt t.to_input() {
int(v) { io::println("int"); }
str(v) { io::println("str"); }
}
}
fn main() {
to_input(5);
to_input("hello")
}
iface to_input { fn to_input() -> input; }
impl of to_input for int { fn to_input() -> input { ret int(self); } }
impl of to_input for str { fn to_input() -> input { ret str(self); } }
fn to_input<T: to_input>(t: T) {
alt t.to_input() {
int(v) { io::println("int"); }
str(v) { io::println("str"); }
}
}
fn main() {
to_input(5);
to_input("hello")
}
В принципе, выгляди это дело крайне громоздко, но, я думаю, что количество кода можно существенно подсократить засчет использования макросов.