静态类常数与常数名称空间
static class constants vs namespace of constants
想象一下您想用类的通用名称实现"特殊"案例。让我们以班级颜色为例,以下定义:
struct Color {
float r, g, b;
constexpr Color(float r, float g, float b) : r(r), g(g), b(b) {}
};
想象我们希望以某种有组织的方式定义常数,例如"红色","蓝色"等。我遇到了这两种定义它们的方式:
1(作为颜色类中的静态常数,例如Color::RED
,Color::GREEN
2(在一个名为"班级复数"的命名空间内:
namespace Colors{
constexpr Color RED(1, 0, 0);
/* ETC */
}
因此,它们作为Colors::RED
Colors::BLUE
...
我发现第二个更易于维护,因为它只需要一个定义一个元素,而第一个需要两个声明,其中一个是内部的,另一个则需要一个。但是我不确定它的正确性。
简而言之:我询问第二种是正确的方法还是我应该选择第一个或任何其他选择。我不是指它是否编译,它确实如此。我说的是良好的设计实践。
它完全取决于您。
就我个人而言,每当我添加新的"预设"时,我就不必更改类别的定义。因此,除非班级的实施本身需要那些常数,否则我将把它们拒之门外。
但是,您不能将命名空间作为模板参数传递,因此有时(在更复杂的情况下(您会与一堂课"卡住"。不过,这不必是类Color
。
第一个需要两个声明,一个内部和另一个声明
从C 17开始,这已不再正确;我们有inline
。
相关文章:
- 为什么 Clang 在命名空间'std'中没有名为 'copy' 的成员给出错误
- 名称后跟"::"必须是类或命名空间错误,即使"::"后面是类名
- Catalina C++:使用<cmath>标头产生错误:全局命名空间中没有名为 'signbit' 的成员
- 如何解决两个不使用命名空间的第三方库之间的类名冲突?
- 静态类常数与常数名称空间
- 命名空间 pcl 在点云库中没有名为 PointCloud 的成员
- 从类方法调用命名空间中名为 Same 的函数时,重载解析失败
- 我可以定义一个(键入的)常数,该常数确定不占据可执行文件中的空间
- C :将外部链接与未命名的名称空间使用常数变量
- 类名和枚举值之间的冲突:无需命名空间即可解析
- 在另一个带有名称空间的标头文件中定义常数
- 命名空间"std"中没有名为 'vsnprintf' 的成员;你是说"VSPRINTF"吗?
- C++当命名空间、类名和命名空间::类名冲突时该怎么办
- 是否可以在编译时获得一个包含命名空间和类名的字符串
- 命名空间中的类名冲突
- C++:如何让函数接受来自任何命名空间的具有相同类名的对象
- Android NDK - 命名空间'std'中没有名为 'function' 的类型
- C++ 编译失败,并显示错误:命名空间中没有名为 'snprintf' 的成员'std'
- 我们可以像在名称空间中那样对类名进行别名吗
- 类名可以用作命名空间吗