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 相关问题,或者出现内存错误。

                     

© 小时科技 保留一切权利