写排序函数时遇到一个关于模板的问题,有一定记录价值。需求如下:

1
2
3
4
5
template<class T>
void mySort(T* vec, int len);

template<class function>
void sortTester(function fun);

其中 mySort 是我自己编写的排序函数,vec 是数组,len 是数组长度;sortTester 是对数器,用来生成随机样例来检测传入的排序函数,参数 fun 为我们要传入并检测的函数。

当我想当然地进行如下调用时,编译器报错:

1
sortTester(mySort);

这是很容易犯的一种错误,其实稍加思索后就能发现问题所在: sortTester 的参数类型 function 是一个模板类型,而传入的参数 mySort 是一个函数模板,所以 sortTester 当然就无法进行函数类型推断,因而报错。所以我们必须传入一个确定的函数类型,而非函数模板,即,将函数模板实例化。

有下面两种方式将函数模板实例化(这里实例化为 int ):

1
2
3
//方式1
auto funcPtr = mySort<int>;
sortTester(funcPtr);
1
2
//方式2
sortTester([](int* arr, int len){mySort(arr, len);});

尤其是第二种 lambda 方式值得学习!