如何使用typename和非typename模板参数调用泛型函数



我需要用以下原型实现一个函数:

template<typename Iterator, size_t NBITS>
void radix_sort(Iterator first, Iterator last) {
// some code
}

如果没有NBITS模板参数,它会自己弄清楚Iterator是什么,我会调用没有<>的函数。在这里,我想指定调用函数时NBITS的值。

我不确定在这种情况下是否也需要提供Iterator的类型,以及我将如何做到这一点。

当我提供NBITS的值时,我可以用一种它可以自己计算Iterator的方式来调用它吗?

注意:我不允许编辑原型

对于当前函数模板,如果还想指定size_t参数,则需要显式提供Iterator模板参数。您可以通过将第一个参数的类型传递给函数来实现这一点

std::vector<int> v;
radix_sort<decltype(v.begin()), 42>(v.begin(), v.end());

为了避免在调用站点指定Iterator,您可以添加另一个重载来交换模板参数,并使用推导的类型调用重载

template<std::size_t NBITS, typename Iterator>
void radix_sort(Iterator first, Iterator last) 
{
radix_sort<Iterator, NBITS>(first, last);
}