C++ 函数指针和匿名函数lambda

函数指针

使用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 

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]

你可能感兴趣的:(c++,c++,开发语言)