C++ 的可调用类型

                     

贡献者: addis

   可调用类型(Callable)

   最经典的是 C 语言的函数指针。C++ 还引入了函数引用,用法和指针类似(* 换成 & 即可)。

1. lambda 函数

   lambda 函数是 C++11 引入的。除了语法更简洁,好处主要在于可以修改函数的接口,预先填装一些参数或者改变参数的顺序或类型。例如一个积分函数 integral(T integrand, double start, doube end) 若要求 integrand 只接收一个 double 返回一个 double,但我们想要积分的函数还需要其他若干参数。这时就可以直接 capture:auto integral = [&param1, &param2](double x) { return fun1(param1, param2, x); }。其中 & 是 capture by reference。也就是说 lambda 定义以后,仍然可以改变它们的值。不加 & 就是 capture by value,复制定义时的值。

2. functor

   functor 也可以达到 lambda 一样的效果。可以把 param1, param2 都用数据成员储存,在 operator() 中调用。但比起 lambda 还是略嫌麻烦。

3. 强制类型转换

   用模板的一个坏处就是每种不同的参数都会生成一个额外的函数,会导致编译出的二进制文件体积增大(对非大型程序来说这一般不是问题)。在 C 语言中,函数传参问题的解决方法是把所有参数都用一个 void 指针打包,在函数体中再将其拆解并强制转换成所需的类型。

   该方法的缺点就是如果不小心可能导致 type safety 相关问题,或者出现内存错误。


致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利