【问题标题】:c++ local function within a namespace命名空间内的 c++ 本地函数
【发布时间】:2016-07-10 17:46:55
【问题描述】:

从 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:我想要完成的是,我的库的用户不知道此示例中的函数 Sum()。在这个例子中,它可能真的没有意义,但在我的真实代码中,我经常实现我不希望我的库的用户直接使用的辅助函数(例如,为了防止错误使用)。
  • 在这种情况下,你真的应该像@Cristophe 回答的那样使用 lambda 函数
  • @Algirdas:匿名命名空间可能正是我正在寻找的东西,我将对此进行研究...... Lambda 函数不是一个选项,因为我必须使用旧版本的 C++。

标签: c++ function namespaces nested local


【解决方案1】:

您可以使用 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 () {
        ... 
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2015-03-05
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多