静态类常数与常数名称空间

static class constants vs namespace of constants

本文关键字:空间 常数名 常数 静态类      更新时间:2023-10-16

想象一下您想用类的通用名称实现"特殊"案例。让我们以班级颜色为例,以下定义:

struct Color {
    float r, g, b;
    constexpr Color(float r, float g, float b) : r(r), g(g), b(b) {}
};

想象我们希望以某种有组织的方式定义常数,例如"红色","蓝色"等。我遇到了这两种定义它们的方式:

1(作为颜色类中的静态常数,例如Color::REDColor::GREEN

2(在一个名为"班级复数"的命名空间内:

namespace Colors{
    constexpr Color RED(1, 0, 0);
    /* ETC */
}

因此,它们作为Colors::RED Colors::BLUE ...

访问

我发现第二个更易于维护,因为它只需要一个定义一个元素,而第一个需要两个声明,其中一个是内部的,另一个则需要一个。但是我不确定它的正确性。

简而言之:我询问第二种是正确的方法还是我应该选择第一个或任何其他选择。我不是指它是否编译,它确实如此。我说的是良好的设计实践。

它完全取决于您。

就我个人而言,每当我添加新的"预设"时,我就不必更改类别的定义。因此,除非班级的实施本身需要那些常数,否则我将把它们拒之门外。

但是,您不能将命名空间作为模板参数传递,因此有时(在更复杂的情况下(您会与一堂课"卡住"。不过,这不必是类Color


第一个需要两个声明,一个内部和另一个声明

从C 17开始,这已不再正确;我们有inline