隐藏 constexpr 变量

Hiding constexpr variables

我有一些 constexpr 函数可以让我简单地改变我的算法的行为。这些函数从一些变量中推导出它们的 return 值。一个最小的例子如下所示:

// A.h
constexpr std::array<int,3> a = {1,2,3};

constexpr int Foo() {return a[1]*a[2];}
constexpr int Bar() {return a[3];}

现在,所有这些都在头文件中实现,因为我希望内联这些方法。但是,我不想向包括 A.h 在内的任何人公开 a。我怎样才能做到这一点?

在预模块 C++ 世界中,您的选择是有限的。必须公开您不希望用户看到的事物的定义的常见习惯是创建所谓的 "detail" 命名空间。这是一个命名空间,通常命名为 detail 或类似的名称,它包含所有 而不是 界面部分的内容。按照惯例,用户不应访问该命名空间中的内容。

您可以将 a 设为私有,static constexpr 成为某些 class 的成员。这将更有效地防止用户访问它。但它有一个缺点,那就是你必须 friend 每个使用它的函数。

如果您的函数不是 class 的成员,您可以:

  • public_a.h(a.cpp 的用户可见)
  • private_a.h(包含在 a.cpp 中,位于您的来源中)
  • a.cpp

并将函数放在正确的位置。你只需要确保 a.cpp 可以被某人使用#including only public_a.h.

你也可以有一个公开可见的基础 class 提供你想要的 API 并在派生的 classes 中隐藏自定义,但这会像工厂方法一样增加额外的复杂性.