隐藏 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 中隐藏自定义,但这会像工厂方法一样增加额外的复杂性.
我有一些 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 中隐藏自定义,但这会像工厂方法一样增加额外的复杂性.