跳转至

1.函数指针 Function pointeer

  • 函数指针 funtion 可以指向一个函数的地址,通过 funtion()来调用
  • 函数指针的声明很奇怪,一般就使用 auto 来自动适配类型。
  • 也可以使用 typedef 来取别名(感觉也很奇怪)
  • 作为参数使用,实现 C#类似委托的效果,可以执行回调函数。
          //-------取别名---------
        typedef void(*HelloWorldFunction)(/*这里是参数*/);
        HelloWorldFunction funtion = HelloWorld
    
    *
void HelloWorld()
{
    std::cout<<"HelloWorld" << std::endl;
}

int main()
{
    //取得这个函数的指针
    //实际上是:
    //    auto function = &HelloWorld;
    //编译器提供了隐式转换
    auto function = HelloWorld;
    //然后我们就可以执行函数
    function();

    //-----本质-------
    void(*maric)();
    maric = HelloWorld;
    maric();
    //
    void(*ljc)() = HelloWorld;
    ljc();

    //-------取别名---------
    typedef void(*HelloWorldFunction)();
    HelloWorldFunction funtion = HelloWorld
    std::cin.get();
}

制作一个 ForEach

  • 遍历时,执行某个方法
    void PrintValue(int value)
    {
        std::cout << "Value: "
    }
    
    void ForEach(const std::vector<int>& values, void(*func)(int))
    {
        for(int value: values)
            func(value);
    }
    
    int main()
    {
        std::vector<int> values = {1, 5, 4, 2, 3};
        ForEach(values,PrintValue);
    
    
        std::cin.get();
    }
    

2. 使用 lambada 匿名函数

  • lambada 是我们的代码在过程中生成的,用完即弃的函数
  • 格式
    • []lambda 捕获,= &,a,&a,捕获需要函数指针使用 std:: function 函数
    • ()参数
    • {}表达式
  • lambda 捕获后需要加上 mutable 才能修改值。
    void ForEach(const std::vector<int>& values, void(*func)(int))
    {
        for(int value: values)
            func(value);
    }
    
    int main()
    {
        std::vector<int> values = {1, 5, 4, 2, 3};
        ForEach(values,[](int value){std::cout << "Value:" << value << std::endl; });
    
        auto lambda = [](int value){std::cout << "Value:" << value <<std::endl; });
    
        Foreach(values,lambda)
    
        std::cin.get();
    }
    

lambda Capture 捕获

  • [ = ]可以获取外部值传递,passed everything by value
  • [ & ]可以获取外部引用传递,passed everything by reference
  • [ a ]也可以单独获取一个参数的值传递,passed by value
  • [ &a ]也可以单独获取一个参数的引用传递,passed by reference
  • 传入捕获的 lambda 需要使用 function 方法
      int a = 5;
    
    auto lambda = [=](int value){ std::cout << "Value:" << a <<std::endl; };
    
    //然而,这样捕获会导致Foreach出错
    //Foreach(values, lambda); Eroor!!!
    
    我们需要修改方法的参数
    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, 5, 4, 2, 3};
    
        auto lambda = [=](int value){std::cout << "Value:" << value <<std::endl; });
    
        Foreach(values,lambda)
    
        std::cin.get();
    }
    

再见 mutable

int main()
{
    std::vector<int> values = {1, 5, 4, 2, 3};
    auto lambda = [=](int value) mutable {std::cout << "Value:" << value <<std::endl; });
    Foreach(values,lambda)
    std::cin.get();
}