鱼C论坛

 找回密码
 立即注册
查看: 2426|回复: 5

回调函数?关于C++的函数指针

[复制链接]
发表于 2020-10-26 03:17:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
RT,试着帮我看看下面的test函数为啥调用会报错,说参数类型不匹配???

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;

  4. template <typename T>
  5. void selectsort(vector<T>& arr)
  6. {
  7.     T temp;
  8.     for(int i=0; i<arr.size()-1; i++)
  9.     {
  10.        for(int j=i+1; j<arr.size(); j++)
  11.        {
  12.            if(arr[j] < arr[i])
  13.            {
  14.                 temp = arr[j];
  15.                 arr[j] = arr[i];
  16.                 arr[i] = temp;
  17.            }
  18.        }
  19.     }
  20. }

  21. template <typename T>
  22. void bubblesort(vector<T>& arr)
  23. {
  24.     T temp;
  25.     for(int i=0; i<arr.size(); i++)
  26.     {
  27.         for(int j=0; j<arr.size()-i-1; j++)
  28.         {
  29.             if(arr[j] > arr[j+1])
  30.             {
  31.                 temp = arr[j];
  32.                 arr[j] = arr[j+1];
  33.                 arr[j+1] = temp;
  34.             }
  35.         }
  36.     }
  37. }

  38. template <typename T>
  39. void insertsort(vector<T>& arr)
  40. {
  41.     T temp;
  42.     for(int i=1; i<arr.size(); i++)
  43.     {
  44.         for(int j=i; j>0 && arr[j]<arr[j-1]; j--)
  45.         {
  46.             temp = arr[j];
  47.             arr[j] = arr[j-1];
  48.             arr[j-1] = temp;
  49.         }
  50.     }
  51. }


  52. template <typename T>
  53. void test(void (*func)(vector<T> vct), vector<T> vct)
  54. {
  55.     func(vct);
  56. }

  57. int main(void)
  58. {
  59.     vector<int> vct {3, 4, 6, 0, -2, -2, 0, 0, -1, -9};
  60.     test(insertsort, vct);

  61.     for(int &e: vct)
  62.         cout << e << ", ";
  63.     cout << endl;
  64.    
  65.     return 0;
  66. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-26 03:20:01 | 显示全部楼层
主要是这个test函数,它接受一个函数指针进行回调
对bubblesort、selectsort和quicksort进行排序

test(排序函数, vector类型); //这是我想法的样子,但是调用失败了,说参数不匹配???

  1. template <typename T>
  2. void test(void (*func)(vector<T> vct), vector<T> vct)
  3. {
  4.     func(vct);
  5. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-26 03:24:47 | 显示全部楼层
还是说template只能接受一层,就是说因为这里被调用的函数(函数指针指向的函数,也就是那三个排序算法),本身也是template function,而调用所在的test函数也是一个template函数,,,所以不行,,,不知道对不对,好像是那个template的初始化问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-26 07:07:09 | 显示全部楼层
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;

  4. template <typename T>
  5. void selectsort(vector<T>& arr)
  6. {
  7.     T temp;
  8.     for(int i=0; i<arr.size()-1; i++)
  9.     {
  10.        for(int j=i+1; j<arr.size(); j++)
  11.        {
  12.            if(arr[j] < arr[i])
  13.            {
  14.                 temp = arr[j];
  15.                 arr[j] = arr[i];
  16.                 arr[i] = temp;
  17.            }
  18.        }
  19.     }
  20. }

  21. template <typename T>
  22. void bubblesort(vector<T>& arr)
  23. {
  24.     T temp;
  25.     for(int i=0; i<arr.size(); i++)
  26.     {
  27.         for(int j=0; j<arr.size()-i-1; j++)
  28.         {
  29.             if(arr[j] > arr[j+1])
  30.             {
  31.                 temp = arr[j];
  32.                 arr[j] = arr[j+1];
  33.                 arr[j+1] = temp;
  34.             }
  35.         }
  36.     }
  37. }

  38. template <typename T>
  39. void insertsort(vector<T>& arr)
  40. {
  41.     T temp;
  42.     for(int i=1; i<arr.size(); i++)
  43.     {
  44.         for(int j=i; j>0 && arr[j]<arr[j-1]; j--)
  45.         {
  46.             temp = arr[j];
  47.             arr[j] = arr[j-1];
  48.             arr[j-1] = temp;
  49.         }
  50.     }
  51. }


  52. template <typename T>
  53. void test(void (*func)(vector<T> &vct), vector<T> &vct)//  vector<T>& arr vector<T> &vct
  54. {
  55.     func(vct);
  56. }

  57. int main(void)
  58. {
  59.     vector<int> vct {3, 4, 6, 0, -2, -2, 0, 0, -1, -9};
  60.     test(insertsort, vct);

  61.     for(int &e: vct)
  62.         cout << e << ", ";
  63.     cout << endl;
  64.    
  65.     return 0;
  66. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-26 13:27:17 | 显示全部楼层

什么意思,不是要把被测试的函数指针传到test函数的参数里面吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-26 13:28:03 | 显示全部楼层

谢谢回复。

vector<t>& arr vector<t>& vct

这不是函数指针吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-15 05:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表