川建军 发表于 2020-10-26 03:17:31

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

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

#include <iostream>
#include <vector>
using namespace std;

template <typename T>
void selectsort(vector<T>& arr)
{
    T temp;
    for(int i=0; i<arr.size()-1; i++)
    {
       for(int j=i+1; j<arr.size(); j++)
       {
         if(arr < arr)
         {
                temp = arr;
                arr = arr;
                arr = temp;
         }
       }
    }
}

template <typename T>
void bubblesort(vector<T>& arr)
{
    T temp;
    for(int i=0; i<arr.size(); i++)
    {
      for(int j=0; j<arr.size()-i-1; j++)
      {
            if(arr > arr)
            {
                temp = arr;
                arr = arr;
                arr = temp;
            }
      }
    }
}

template <typename T>
void insertsort(vector<T>& arr)
{
    T temp;
    for(int i=1; i<arr.size(); i++)
    {
      for(int j=i; j>0 && arr<arr; j--)
      {
            temp = arr;
            arr = arr;
            arr = temp;
      }
    }
}


template <typename T>
void test(void (*func)(vector<T> vct), vector<T> vct)
{
    func(vct);
}

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

    for(int &e: vct)
      cout << e << ", ";
    cout << endl;
   
    return 0;
}

川建军 发表于 2020-10-26 03:20:01

主要是这个test函数,它接受一个函数指针进行回调
对bubblesort、selectsort和quicksort进行排序

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

template <typename T>
void test(void (*func)(vector<T> vct), vector<T> vct)
{
    func(vct);
}

川建军 发表于 2020-10-26 03:24:47

还是说template只能接受一层,就是说因为这里被调用的函数(函数指针指向的函数,也就是那三个排序算法),本身也是template function,而调用所在的test函数也是一个template函数,,,所以不行,,,不知道对不对,好像是那个template的初始化问题

baige 发表于 2020-10-26 07:07:09

#include <iostream>
#include <vector>
using namespace std;

template <typename T>
void selectsort(vector<T>& arr)
{
    T temp;
    for(int i=0; i<arr.size()-1; i++)
    {
       for(int j=i+1; j<arr.size(); j++)
       {
         if(arr < arr)
         {
                temp = arr;
                arr = arr;
                arr = temp;
         }
       }
    }
}

template <typename T>
void bubblesort(vector<T>& arr)
{
    T temp;
    for(int i=0; i<arr.size(); i++)
    {
      for(int j=0; j<arr.size()-i-1; j++)
      {
            if(arr > arr)
            {
                temp = arr;
                arr = arr;
                arr = temp;
            }
      }
    }
}

template <typename T>
void insertsort(vector<T>& arr)
{
    T temp;
    for(int i=1; i<arr.size(); i++)
    {
      for(int j=i; j>0 && arr<arr; j--)
      {
            temp = arr;
            arr = arr;
            arr = temp;
      }
    }
}


template <typename T>
void test(void (*func)(vector<T> &vct), vector<T> &vct)//vector<T>& arr vector<T> &vct
{
    func(vct);
}

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

    for(int &e: vct)
      cout << e << ", ";
    cout << endl;
   
    return 0;
}

川建军 发表于 2020-10-26 13:27:17

baige 发表于 2020-10-26 07:07


什么意思,不是要把被测试的函数指针传到test函数的参数里面吗

川建军 发表于 2020-10-26 13:28:03

baige 发表于 2020-10-26 07:07


谢谢回复。

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

这不是函数指针吧
页: [1]
查看完整版本: 回调函数?关于C++的函数指针