C++命名空间中的本地函数

3

作为从ADA转换到C++的人,我非常想念的一件事情就是无法使用嵌套或本地函数。在ADA中,我可以这样做:

procedure TotalSum ()
is
    function Sum (a : Float; b : Float) return Float;
    is
    begin
        return a + b;
    end Sum;

    x : Float := 1.0;
    y : Float := 1.0;
    z : Float := 1.0;
    sum : Float;
begin
    sum := Sum(x,y);
    sum := Sum(sum,z);
end TotalSum;

这样做的好处是我可以限制仅在本地使用的函数的范围。对于类,我习惯于声明私有函数以限制范围(这在某种程度上限制了范围)。但现在我正在将函数库实现为命名空间而不是类,并且我还没有找到一个很好的解决方案来限制我的局部函数的作用域。
在C++命名空间中实现以上目标的最佳实践是什么?

我并不确定你想要实现什么。但是如果你只是想在C++中限制这些函数的作用域,只需将它们添加到命名空间中(例如:sumname),然后使用它们:sumname::TotalSum()sumname::Sum() - DimChtz
匿名命名空间有什么问题吗?它们将本地函数的作用域限制为单个翻译单元。 - Algirdas Preidžius
@DimChtz:我想要实现的是,我的函数Sum()在这个例子中不被我的库的用户所知道。在这个例子中可能并没有太多意义,但在我的真实代码中,我经常实现一些辅助函数,我不希望我的库的用户直接使用它们(例如为了防止错误使用)。 - Tom
1
在这种情况下,您应该像@Cristophe所回答的那样使用lambda函数。 - DimChtz
@Algirdas:匿名命名空间可能正是我正在寻找的,我要研究一下... Lambda函数不是一个选项,因为我必须使用较旧版本的C++。 - Tom
1个回答

7
您可以使用 lambda函数 完美地定义本地函数:
int TotalSum () {

    auto Sum = [](float a, float b) -> float {
        return a + b;
    };

    float x= 1.0;
    float y= 1.0;
    float z= 1.0;

    float sum = Sum(x,y);
    sum = Sum(sum,z);
    return sum; 
}

另一种将函数完全局限于实现的方法是使用匿名命名空间。在匿名命名空间中定义的元素仅局限于翻译单元 (即仅在一个 cpp 文件中有效):

namespace mylib {

    namespace {   // nested anonymous namespace - visible only in this cpp 
        float Sum (float a, float b) {
            return a + b;
        }
    };

    int TotalSum () {
        ... 
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接