鱼C论坛

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

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

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

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

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

x
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[j] < arr[i])
           {
                temp = arr[j];
                arr[j] = arr[i];
                arr[i] = 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[j] > arr[j+1])
            {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = 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[j]<arr[j-1]; j--)
        {
            temp = arr[j];
            arr[j] = arr[j-1];
            arr[j-1] = 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 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[j] < arr[i])
           {
                temp = arr[j];
                arr[j] = arr[i];
                arr[i] = 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[j] > arr[j+1])
            {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = 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[j]<arr[j-1]; j--)
        {
            temp = arr[j];
            arr[j] = arr[j-1];
            arr[j-1] = 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

什么意思,不是要把被测试的函数指针传到test函数的参数里面吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢回复。

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

这不是函数指针吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 20:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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