C++ - 函数指针

  1. 简介
  2. 顺道说一下
  3. demo
  4. lambda表达式

简介

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

顺道说一下

  • 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;

欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qinhan_shu@163.com

文章标题:C++ - 函数指针

本文作者:QinHan

发布时间:2020-01-09, 00:31:10

最后更新:2020-02-20, 05:42:12

原始链接:https://qinhan.site/2020/01/09/cpp-func-ptr/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏