隐藏constexpr变量

时间:2018-11-26 09:59:32

标签: c++ c++17 constexpr

我有一些constexpr函数,这些函数使我可以简单地更改算法的行为。这些函数从某些变量推导出其返回值。一个最小的示例如下所示:

// 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在内的任何人公开A.h。我该如何实现?

2 个答案:

答案 0 :(得分:3)

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

您可以将a设为某个类的static constexpr成员。这将更有效地阻止用户访问它。但这有缺点,因此您必须friend使用它的每个函数。

答案 1 :(得分:0)

如果您的函数不是该类的成员,则可以:

  • public_a.h(a.cpp用户可见)
  • private_a.h(由a.cpp随附,位于您的源代码中)
  • a.cpp

并将功能放置在正确的位置。您只需要确保a.cpp可以被某人#仅包含public_a.h使用。

您还可以有一个公共可见的基类,该基类提供所需的API,并将自定义项隐藏在派生类中,但这会增加额外的复杂性,例如工厂方法。