函数指针和函数对象不是同一类型怎么替换

简介: 函数指针和函数对象不是同一类型,为何可替换用作同一函数的参数

函数指针和函数对象不是同一类型,为何可替换用作同一函数的参数?

看下面STL std::sort()使用函数指针和函数对象的情形?

// sort algorithm example

include // std::cout

include // std::sort

include // std::vector

bool myfunction (int i,int j) { return (i<j); }

struct myclass {
bool operator() (int i,int j) { return (i<j);}
} myobject;

int main () {
int myints[] = {32,71,12,45,26,80,53,33};
std::vector myvector (myints, myints+8); // 32 71 12 45 26 80 53 33

// using default comparison (operator <):
std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33

// using function as comp
std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)

// using object as comp
std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)

// print out content:
std::cout << "myvector contains:";
for(std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
std::cout << '\n';

return 0;

}
如果自定义sort()函数呢?

include

bool lesser (int a,int b){return ab;}

void mysort(int arr[],int n,bool (comp)(int a,int b))
{
for(int i=0;ib;}
bool operator()(int a,int b){return a>b;}
};
main()
{
int arr[] = {2,7,5,9,3};
int n = sizeof arr / sizeof
arr;
mysort(arr,n,Lesser());
for(int i=0;i<n;i++)
printf("%d ",arr[i]);
printf("\n");
getchar();
}
/
提示错误:
cannot convert parameter 3 from 'class Lesser' to 'bool (__cdecl
)(int,int)'
*/
原因在于函数模板调用时,不需显式声明具体类型,编译器可以自动匹配。

std::sort()是一函数模板:

template
void sort (RandomAccessIterator first, RandomAccessIterator last);

template
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
以下是使用了模板技术的sort函数:

include

bool lesser (int a,int b){return ab;}

template
class Lesser{
public:
bool operator()(T a,T b){return a<b;} // 函数对象
};

class Greater{
public:
bool funcObj(int a,int b){return a>b;} // 演示与下面重载()相同功能
bool operator()(int a,int b){return a>b;}// 函数对象
// 以上两个成员功能一致,无疑后者更简洁,使用方式与函数相同
};
//代码效果参考:http://www.zidongmutanji.com/bxxx/232146.html

template // 需要模板才能传递函数指针或函数对象
void mysort(T arr[],T n,Comp comp)
{
for(T i=0;i<n;i++)
for(T j=0;j<n-i-1;j++)
if(comp(arr[j],arr[j+1]))
{
T t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}

void printArr(int arr[],int n)
{
for(int i=0;i<n;i++)
printf("%d ",arr[i]);
printf("\n");
}

main()
{
Greater gt;
bool a = gt.funcObj(3,4);
bool b = gt(3,4);
// 以上两种函数对象的本质都是方法调用,但后者更简洁,接口统一,形似函数
int arr[] = {2,7,5,9,3};
int n = sizeof arr / sizeof *arr;

printArr(arr,n);
mysort(arr,n,greater); // 函数指针
printArr(arr,n);
mysort(arr,n,lesser); //  // 函数指针
printArr(arr,n);
mysort(arr,n,Greater()); // 匿名对象
printArr(arr,n);
mysort(arr,n,Lesser<int>());  // 匿名对象
printArr(arr,n);

getchar();

}
/
2 7 5 9 3
2 3 5 7 9
9 7 5 3 2
2 3 5 7 9
9 7 5 3 2
/

相关文章
|
21天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
47 4
|
2月前
|
存储 C语言 C++
如何通过指针作为函数参数来实现函数的返回多个值
在C语言中,可以通过将指针作为函数参数来实现函数返回多个值。调用函数时,传递变量的地址,函数内部通过修改指针所指向的内存来改变原变量的值,从而实现多值返回。
|
2月前
|
存储 搜索推荐 C语言
如何理解指针作为函数参数的输入和输出特性
指针作为函数参数时,可以实现输入和输出的双重功能。通过指针传递变量的地址,函数可以修改外部变量的值,实现输出;同时,指针本身也可以作为输入,传递初始值或状态。这种方式提高了函数的灵活性和效率。
|
2月前
利用指针函数
【10月更文挑战第2天】利用指针函数。
18 1
|
2月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
33 2
|
2月前
|
算法 搜索推荐 C语言
【C语言篇】深入理解指针4(模拟实现qsort函数)
【C语言篇】深入理解指针4(模拟实现qsort函数)
24 2
|
2月前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
|
2月前
对象指针输出时分秒
对象指针输出时分秒
9 0
|
3月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
Linux
在Linux内核中根据函数指针输出函数名称
在Linux内核中根据函数指针输出函数名称