模板函数、功能参数的默认值

default value for template function, functional parameter

本文关键字:参数 默认值 功能 函数      更新时间:2023-10-16
template<typename Iterator, typename typename Comparator = std::less<typename std::iterator_traits<Iterator>::value_type>>
static void sort(Iterator begin, Iterator end, Comparator cmp = Comparator())
{
    ...
}

我有以下模板功能:

template<typename func>
static void sort_test(func sort)
{
    ...
    sort(somevector.begin(), somevector.end());
    ...
}
int main()
{
    sort_test(&sort<vector<int, allocator<int>>::iterator>);
    return 0;
}

错误 C2198:"void (__cdecl *)(迭代器,迭代器,std::less)":调用参数太少

如果我尝试通过提供默认参数来绕过它:

template<typename func>
static void sort_test(func sort)
{
    ...
    sort(somevector.begin(), somevector.end(), std::less<int>);
    ...
}
int main()
{
    sort_test(&sort<vector<int, allocator<int>>::iterator>,
                    std::less<int>);
    return 0;
}

错误 C2275:"std::less":非法使用此类型作为表达式

默认参数不是函数签名的一部分,因此当您通过指向函数间接寻址的指针时,就像您在第一个示例中所做的那样,该信息会丢失。如果使用 2 个迭代器参数直接在 main 中调用 sort 函数,则代码将编译。

在第二个示例中,您收到编译错误,因为您尝试将类型而不是实例传递给sort

sort(somevector.begin(), somevector.end(), std::less<int>());

模板参数列表中还有一个额外的typename用于sort

template<typename Iterator, typename typename Comparator = std::less<typename std::iterator_traits<Iterator>::value_type>>
//                          ^^^^^^^^