C++如何使用lambda模板函数做参数

Fenice 2017-02-07 10:43:50

#include <iostream>
#include <functional>

template <typename T>
void Swap(T *a, T *b) {
T tmp = *a;
*a = *b;
*b = tmp;
}

template <typename T>
int partition(T array[], int low, int high, const std::function<int(T, T)> &cmp) {
int i = low - 1;
T x = array[high];
for (int j = low; j < high; j++) {
if (cmp(array[j], x)) {
i++;
Swap(array[j], array[i]);
}
}
array[i + 1] = x;
return i + 1;
}

template <typename T>
void quicksort(T array[], int low, int high, const std::function<int(T, T)> &cmp) {
if (low < high) {
int mid = partition(array, low, high, cmp);
quicksort(array, low, mid - 1, cmp);
quicksort(array, mid + 1, high, cmp);
}
}

int main() {
std::cout << "Hello, World!" << std::endl;
int arr[] {5, 3, 9, 1, 6, 2};
quicksort(arr, 0, 5, [](int a, int b) -> int {
return a < b;
});
for(auto item: arr) {
std::cout << item << " ";
}
std::cout << std::endl;
return 0;
}


编译报错:

E:\Project\DesignPattern\main.cpp: In function 'int main()':
E:\Project\DesignPattern\main.cpp:39:6: error: no matching function for call to 'quicksort(int [6], int, int, main()::<lambda(int, int)>)'
});
^
E:\Project\DesignPattern\main.cpp:26:6: note: candidate: template<class T> void quicksort(T*, int, int, const std::function<int(T, T)>&)
void quicksort(T array[], int low, int high, const std::function<int(T, T)> &cmp) {
^
E:\Project\DesignPattern\main.cpp:26:6: note: template argument deduction/substitution failed:
E:\Project\DesignPattern\main.cpp:39:6: note: 'main()::<lambda(int, int)>' is not derived from 'const std::function<int(T, T)>'
});
^
main中quicksort中定义的lambda函数与std::function<int(T,T)>不匹配,如何能让std::function<int(T,T> &cmp接受那个lambda函数参数呢?
...全文
702 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fenice 2017-02-07
  • 打赏
  • 举报
回复
引用 1 楼 ri_aje 的回复:
改成这样,其它的以此类推。

template <typename T, typename F>
void quicksort(T array[], int low, int high, F const& cmp);
解决了,谢谢!
ztenv 版主 2017-02-07
  • 打赏
  • 举报
回复
你把模板去掉试试
ri_aje 2017-02-07
  • 打赏
  • 举报
回复
改成这样,其它的以此类推。

template <typename T, typename F>
void quicksort(T array[], int low, int high, F const& cmp);
背西风酒旗 2017-02-07
  • 打赏
  • 举报
回复
swap函数的形参应该用引用吧!后面的函数Swap(array[j], array[i]);明显传递的是值而不是指针

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧