想象一下,您想使用类的通用名称来实例化“特殊”案例。让我们以下面定义的Color类为例:
struct Color {
float r, g, b;
constexpr Color(float r, float g, float b) : r(r), g(g), b(b) {}
};
想象一下我们想以某种有组织的方式定义常量,例如“ RED”,“ BLUE”等。我碰到了这两种定义它们的方法:
1)作为Color类内部的静态常量,例如Color::RED
,Color::GREEN
2)在命名为类的复数的命名空间内:
namespace Colors{
constexpr Color RED(1, 0, 0);
/* ETC */
}
因此,它们以Colors::RED
Colors::BLUE
...
我发现第二个更易于维护,因为每个元素只需要一个定义,而第一个则需要两个声明,一个在类内,另一个在类外。但是我不确定它的正确性。
简而言之:我在问第二个是正确的方法还是我应该选择第一个或任何其他替代方法。我指的不是编译,而是编译。我说的是好的设计规范。
答案 0 :(得分:1)
完全取决于您。
我个人不需要添加新的“预设”就必须更改类定义。因此,除非类的实现本身需要这些常量,否则我将其排除在外。
但是,您不能将名称空间作为模板参数传递,因此有时(在更为复杂的情况下)您会被类“卡住”。仍然不必是类Color
。
第一个需要两个声明,一个在类内部,另一个在类外部
从C ++ 17开始,这不再是事实; we have inline
。