为什么 std::sort 不要求用户指定模板类型?
why does std::sort not require the user to specify the templated types?
如果我没理解错的话,在标准库中,存在这样的定义 std::sort()
:
template< class RandomIt >
constexpr void sort( RandomIt first, RandomIt last );
假设我有一个要排序的向量:
std::vector<int> data {9, 7, 5, 3, 1};
如果是这样,那我为什么只能写:
std::sort(data.begin(), data.end());
而不是要求:
std::sort<std::vector<int>::iterator>(data.begin(), data.end());
如果可能的话,有人可以提供一个通用的解释吗?我想我肯定见过不止一个这样的例子,其中模板类型几乎似乎是自动推导出来的……或者它是自动推导出来的……?
or is it being automatically deduced...?
是的。
当函数参数使用模板参数时,模板参数可以从传递给函数的参数推导出来。因此,在这种情况下 RandomIt
是从参数 data.begin()
和 data.end()
.
中推导出来的
如果我没理解错的话,在标准库中,存在这样的定义 std::sort()
:
template< class RandomIt >
constexpr void sort( RandomIt first, RandomIt last );
假设我有一个要排序的向量:
std::vector<int> data {9, 7, 5, 3, 1};
如果是这样,那我为什么只能写:
std::sort(data.begin(), data.end());
而不是要求:
std::sort<std::vector<int>::iterator>(data.begin(), data.end());
如果可能的话,有人可以提供一个通用的解释吗?我想我肯定见过不止一个这样的例子,其中模板类型几乎似乎是自动推导出来的……或者它是自动推导出来的……?
or is it being automatically deduced...?
是的。
当函数参数使用模板参数时,模板参数可以从传递给函数的参数推导出来。因此,在这种情况下 RandomIt
是从参数 data.begin()
和 data.end()
.