Boost C++ 库

...世界上最受尊敬和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码规范

Next

第 1 章. Boost.LocalFunction 1.0.0

Lorenzo Caminiti

根据 Boost 软件许可协议 1.0 版(参见随附文件 LICENSE_1_0.txt 或 https://boost.ac.cn/LICENSE_1_0.txt 的副本)分发。

目录

简介
入门指南
本文档
编译器和平台
安装
教程
局部函数
绑定变量
绑定对象 this
模板
高级主题
默认参数
宏中的逗号和符号
赋值和返回
嵌套
访问类型(概念等)
指定类型(无 Boost.Typeof)
内联
递归
重载
异常规范
存储类说明符
单行扩展
限制(运算符等)
示例
GCC Lambdas(不使用 C++11)
常量块
作用域退出
Boost.Phoenix 函数
闭包
GCC 嵌套函数
N-论文
附录:替代方案
附录:无可变参数宏
附录:实现
参考
发行说明
参考书目
致谢

此库允许在其他函数内部以及直接在需要它们的作用域内编写局部函数。

局部函数(也称为 嵌套函数)是一种 信息隐藏 的形式,它们对于将过程任务划分为仅在本地有意义的子任务非常有用,避免用与这些部分无关的函数、变量等来杂乱程序的其他部分。因此,局部函数补充了其他结构化可能性,例如命名空间和类。局部函数是许多编程语言的特性,特别是 PascalAda,但 C++03 中缺少此特性(另请参阅 [N2511])。

使用 C++11 lambda 函数,可以通过命名 lambda 函数并将它们分配给局部变量来实现局部函数。例如(另请参阅 add_cxx11_lambda.cpp

int main(void) {                            // Some local scope.
    int sum = 0, factor = 10;               // Variables in scope to bind.

    auto add = [factor, &sum](int num) {    // C++11 only.
        sum += factor * num;
    };

    add(1);                                 // Call the lambda.
    int nums[] = {2, 3};
    std::for_each(nums, nums + 2, add);     // Pass it to an algorithm.

    BOOST_TEST(sum == 60);                  // Assert final summation value.
    return boost::report_errors();
}

此库允许在 C++03C++11 之间可移植地编写局部函数(并且在 C++11 编译器上具有与 lambda 函数相当的性能)。例如(另请参阅 add.cpp

int main(void) {                            // Some local scope.
    int sum = 0, factor = 10;               // Variables in scope to bind.

    void BOOST_LOCAL_FUNCTION(const bind factor, bind& sum, int num) {
        sum += factor * num;
    } BOOST_LOCAL_FUNCTION_NAME(add)

    add(1);                                 // Call the local function.
    int nums[] = {2, 3};
    std::for_each(nums, nums + 2, add);     // Pass it to an algorithm.

    BOOST_TEST(sum == 60);                  // Assert final summation value.
    return boost::report_errors();
}

此库支持局部函数的以下功能

  • 局部函数可以捕获,或者更好地说是 绑定,来自封闭作用域的任何变量(函数及其捕获的变量也称为 闭包)。
  • 局部函数体使用常用的 C++ 语句语法进行编程(因此,编译器错误和调试保留其通常的含义和格式)。
  • 局部函数可以作为模板参数传递,因此可以方便地与 STL 算法和其他模板一起使用。[1]
  • 但是,局部函数必须在声明性上下文中指定(例如,在可以声明局部变量的代码点),因此它们不能在表达式中指定。[2]

有关此库、C++11 lambda 函数Boost.Phoenix 和其他实现与局部函数相关功能的 C++ 技术之间的比较,请参阅 替代方案 部分。



[1] 相对于使用局部类实现的 C++03 仿函数,这是一个优势,因为局部类不能作为模板参数传递(请参阅 [N2657]替代方案 部分)。

[2] 相对于 C++11 lambda 函数,这是一个弱点,因为 C++11 lambda 函数也可以在表达式中指定(请参阅 替代方案 部分)。


Next