C++ - 函数指针

简介

  • 函数指针就是 分配一个函数到一个变量中
  • 这样就可以传一个函数作为入参到另外一个函数中

顺道说一下

  • c++ 中的 using 关键字的用法,类似于 golang 中的 type 关键字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>

using MY_FUNC = void(*)(int a);

void Print(int a)
{
std::cout << a << std::endl;
}

void DoMyJob(MY_FUNC job)
{
job(34);
}

int main()
{
DoMyJob(Print);
}

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 #include <string>
#include <vector>
#include <iostream>
#include <functional>

void PrintHello(int value)
{
std::cout << "value = " << value << std::endl;
}

void ForEach(const std::vector<int>& vv, std::function<void(int)> func)
{
for (int v : vv)
func(v);
}

// 程序的主函数
int main()
{
void(*func1)(int) = PrintHello;
auto func = PrintHello;
func(1);
func1(3);

std::vector<int> values = {1,2,3,4};
ForEach(values, func);

// 如果这个函数只用一次,写一个定义很麻烦
// 这个时候就需要用到lambda表达式,类似go中的匿名函数
std::vector<int> values2 = {1,2,3,4};
auto l = [](int value){ std::cout << "value = " << value << std::endl; };
ForEach(values2, l);

std::cout << "ok" << std::endl;
return 0;
}

lambda表达式

  • 正常定义

    1
    auto lambda = [](int value ){ std::cout << "value = " << value << std::endl;
  • 如果我需要用到上下文的一些变量呢?可以通过前面的那个 [] 传入

    1
    2
    // 这个 lambda表达式 中, a就是一个上下文的变量,不是入参
    auto lambda = [](int value ){ std::cout << "value = " << value << ", a = " << a << std::endl;
  • 解决方案

    • [=] : 上下文所有拷贝传入
    • [&] : 上下文所有引用传入
    • [a] : a 拷贝传入
    • [&a] : a 引用传入
1
2
3
int a = 90;

auto lambda = [&a](int value ){ std::cout << "value = " << value << ", a = " << a << std::endl;