Boost C++ 库

……世界上最受推崇和设计精良的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ 编码规范

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 Lambda 表达式(无需 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 函数 的一个缺点,后者可以在表达式中指定(参见 替代方案 部分)。


Next