我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

C++进阶:模板与函数式编程-创新互联

C++进阶:模板与函数式编程

成都创新互联公司从2013年成立,先为新河等服务建站,新河等地企业,进行企业商务咨询服务。为新河企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。文章目录
  • C++进阶:模板与函数式编程
    • 1. 前置知识: 函数指针——将函数作为参数
    • 2. 没有模板的函数式编程: 不好用
    • 3. 模板 + 函数做参数:有奇效!真正的函数式编程
    • 4. lambda表达式(匿名函数): 函数式编程大杀器(C++11引入)

1. 前置知识: 函数指针——将函数作为参数

这一部分随便看看,看不懂无伤大雅, 了解有这个东西就行, 不用深究

void fun(int n) {...
}

void Func(void (*p)(int)) {...
}
// 这里这个参数p的类型 void (*)(int) 就是返回值为void参数为int的函数的指针
// 括号不能丢 丢了就是返回值为void*的函数

int main() {Func(&fun);
}

当然不一定非要传一个函数指针进去, 传函数也可

下面是两种的对比

#include#includevoid num(int n) {std::cout<< n<< std::endl;
}


// 传函数
void func1(void p(int)) {p(1);
    p(2);
}


// 传函数指针
void func2(void (*p)(int)) {p(1);
    p(2);
    p(3);
}

int main() {func1(num);
    func2(&num);
    return 0;
}

如果非要深究, 为什么直接传函数也可以, 其实这是c++的特色, 写成传函数和传函数指针是一个道理, 都是函数指针, 这俩就是完全等价的

2. 没有模板的函数式编程: 不好用
#include#includevoid num(int n) {std::cout<< n<< std::endl;
}

void Func(void fun(int), std::vectorarr) {for(auto i : arr) {fun(i);
    }
}

int main() {Func(num, std::vector{1, 2, 3});
    return 0;
}

就很别扭, 并且函数返回类型, 参数列表都要一致,除了一些特殊场景其它场景都不好用

3. 模板 + 函数做参数:有奇效!真正的函数式编程

上面那种的问题很明显:

我们把函数作为参数传递, 却限制了函数的返回值, 函数的参数列表, 导致通用性很差

有没有办法能不限制函数的类型, 我们只传这个函数进去, 执行他就好

很遗憾答案是不能

虽然做不到不限制函数的类型, 但是我们可以做到在编译时传入函数的时候自动推导他的类型

简单来说就是使用模板

void int_fun(int n) {std::cout<< "int:"<< n<< std::endl;
}

void float_fun(float n) {std::cout<< "float:"<< n<< std::endl;
}

templatevoid do_twice(Func fun) {fun(1);
    fun(2);
}

int main() {do_twice(int_fun);
    do_twice(float_fun);
    return 0;
}
4. lambda表达式(匿名函数): 函数式编程大杀器(C++11引入)

示例

std::vectorv{1, 2, 3};

templateint for_all(Func fun) {int a{0};
    for(auto i : v) {a += fun(i);
    }
}

int main() {// 第一种
    auto myfunc = [] (int n) {std::cout<< n<< std::endl;
    };
    for_all(myfunc);
    
    // 第二种
    for_all([] (int n) ->bool{std::cout<< "hello!"<< std::endl;
        return n >0;
    })
}

如何定义一个匿名函数

不指定返回类型

[](int a, int b){return a + b}
  • [] //捕获列表为空。在函数内无法使用外部变量。
  • [a] //捕获列表为按值传递形式。在函数内仅能使用传递的变量值,无法改变变量。值在匿名函数生成时便已经确定,后续修改不会影响函数内的变量值。
  • [&a] //按引用传递。可改变变量。

指定返回类型

[](double a, double b)->int{return a + b;};

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前名称:C++进阶:模板与函数式编程-创新互联
浏览路径:http://mswzjz.cn/article/cdjeoj.html

其他资讯