函数指针
使用auto
如果不关心函数指针具体类型的话,可以用auto,将函数直接赋值给一个变量chen。
在调用的时候直接使用变量名调用即可,例如:
void HelloWorld()
{
std::cout << "Hello World!" << std::endl;
}
int main()
{
auto chen = HelloWorld;
chen();
chen();
}
函数指针具体类型
上述函数指针的完整写法如下,chen是变量名
void(*chen)() = HelloWorld;
也可以使用typedef定义一个函数指针的类型,然后定义该类型变量,并用函数赋值
void HelloWorld(int a)
{
std::cout << "Hello World! Value: " << a << std::endl;
}
int main()
{
// auto function = HelloWorld;
// void(*chen)(int) = HelloWorld;
typedef void(*aaa)(int);
aaa chen = HelloWorld;
chen(8);
chen(5);
}
使用样例
当我们需要对一些变量,以一定的规则处理时,可以定义一个函数同时接收变量和包含规则或操作的函数:
void PrintValue(int value)
{
std::cout << "Value: " << value << std::endl;
}
void ForEach(const std::vector<int> values, void(*func)(int))
{
for(int value: values)
func(value);
}
int main()
{
std::vector<int> values = {1, 2, 3, 4, 5};
ForEach(values, PrintValue);
}
当然,在调用时,PrintValue这个函数可以使用匿名函数lambda直接实现并传入。
lambda
lambda函数存在是为了让函数可以像一个变量一样传入。
#include <functional>
void ForEach(const std::vector<int> values, const std::function<void(int)>& func)
{
for(int value: values)
func(value);
}
int main()
{
std::vector<int> values = {1, 2, 3, 4, 5};
int a = 1;
ForEach(values, [&](int value){ std::cout << "Value: " << value + a<< std::endl; });
}
[]代表不捕获
[&]代表捕获并使用引用
[=]代表捕获并拷贝
另外[]中可以指定具体捕获的变量名
如[&a]