函数重载 Function Overloading

函数重载的概念对于 C++ 程序员来说是很熟悉的, 举个例子, STL标准库里的 std::sort() 函数是这样声明的:

template< class RandomIt >
void sort( RandomIt first, RandomIt last );
template< class RandomIt >
constexpr void sort( RandomIt first, RandomIt last );
template< class ExecutionPolicy, class RandomIt >
void sort( ExecutionPolicy&& policy,
           RandomIt first, RandomIt last );
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
template< class RandomIt, class Compare >
constexpr void sort( RandomIt first, RandomIt last, Compare comp );
template< class ExecutionPolicy, class RandomIt, class Compare >
void sort( ExecutionPolicy&& policy,
           RandomIt first, RandomIt last, Compare comp );

函数名相同, 参数类型及个数不相同, 进而兼容更多的调用方式.

从某种角度来说 Rust 也是支持函数重载的, 我们先来看一下例子:

#![allow(unused)]
fn main() {
use std::path::Path;
pub struct File {
    fd: i32,
}

impl File {
    pub fn open<P: AsRef<Path>>(p: P) -> Result<Self, std::io::Error> {
        todo!()
    }
}
}

在使用时, 也可以传入很多种不同类型的参数, 只要它们都实现了 AsRef<Path> trait, 例如:

File::open("/etc/passwd");
File::open(PathBuf::from("/etc/passwd"));
File::open(OsStr::new("/etc/passwd"));