Boost C++ 库

…世界上评价最高、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, 《C++ 编码标准》

第 1 章 Boost.LocalFunction 1.0.0 - Boost 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

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

局部函数(又名 嵌套函数)是一种 信息隐藏 的形式,它们有助于将过程式任务分解为仅在局部有意义的子任务,从而避免程序其他部分因不相关的函数、变量等而显得杂乱。因此,局部函数可以与其他结构化可能性(如命名空间和类)相辅相成。局部函数是许多编程语言(尤其是 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 函子(functors)相比,这是一个优势,因为局部类不能作为模板参数传递(请参阅 [N2657]备选方案 部分)。

[2] C++11 lambda 函数 相比,这是一个劣势,因为 C++11 lambda 函数可以另外在表达式中指定(请参阅 备选方案 部分)。


Next