什么是可被转换成函数指针的类对象呢,用下面的例子介绍一下
using func_ptr = void(*)(int, string);
struct Test
{
// 将类对象转换为函数指针
operator func_ptr()
{
return print;
}
static void print(int a, string b)
{
cout << "name: " << b << ", age: " << a << endl;
}
};
主干代码:
operator func_ptr()
{
return print;
}
模板: operator 想转换成的函数指针类型 () 括号内永远都是什么都不用写
{
return 调用的函数指针 //和上面的函数指针类型必须一模一样
}
在这里为什么必须要有一个return 调用的函数指针呢,因为 我们是要实例化出一个对象,从而用对象加()进行初始化和调用 ,就像下面这个例子,简洁的理解就是:我们用func_ptr 告诉大家我们要将类对象转换为什么类型的指针,return后面的就是 我们要将示例出的对象=调用具体哪个函数 (因为将类对象转换成函数指针 我们将对象示例化出来后 相当于调用了某个函数 ),所以func_otr和print的类型必须一模一样
理解完上面问题后,我们想一个问题:return 后面 可以是类成员非静态函数吗 答案是:No!,因为类成员非静态函数是不属于类的,属于对象的,当我们不实例化出一个对象时 这个函数是不存在的 ,而静态函数是属于类的,类存在 静态函数即存在。若在print函数前的static删除,就会报错
#include <iostream>
#include <string>
#include <vector>
using namespace std;
using func_ptr = void(*)(int, string);
struct Test
{
static void print(int a, string b)
{
cout << "name: " << b << ", age: " << a << endl;
}
// 将类对象转换为函数指针
operator func_ptr()
{
return print;
}
};
int main(void)
{
Test t;
// 对象转换为函数指针, 并调用
t(19, "Monkey D. Luffy");
return 0;
}
实例化一个类 就等价于 调用了一个函数(并且可以传参)
当然,像下面这个例子复杂一点
#include <iostream>
#include <string>
#include <vector>
using namespace std;
using func_ptr = void(*)(int, string);
struct Test
{
static void print(int a, string b)
{
cout << "name: " << b << ", age: " << a << endl;
}
// 将类对象转换为函数指针
operator func_ptr()
{
return print;
}
void operator()(string ak)
{
cout<<ak<<endl;
}
};
int main(void)
{
Test t;
// 对象转换为函数指针, 并调用
t(19, "Monkey D. Luffy");
Test e;
e("Doggy");
return 0;
}
这个类有仿函数,也可以将类转换为函数指针,同理,我们传入一个参时就调用仿函数,传入两个参数时就调用转换函数指针,非常灵活。