重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这一部分随便看看,看不懂无伤大雅, 了解有这个东西就行, 不用深究
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;
}
2. 没有模板的函数式编程: 不好用如果非要深究, 为什么直接传函数也可以, 其实这是c++的特色, 写成传函数和传函数指针是一个道理, 都是函数指针, 这俩就是完全等价的
#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}
指定返回类型
[](double a, double b)->int{return a + b;};
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧