gpt4 book ai didi

c++ - 为什么 Fmtflags 被指定两次 - 一次作为枚举的一部分,另一个实例作为静态常量变量

转载 作者:行者123 更新时间:2023-11-30 04:49:45 24 4
gpt4 key购买 nike

在 STD 库文件 ios_base.h 中,我们看到以下内容:

  enum _Ios_Fmtflags 
{
_S_boolalpha = 1L << 0,
_S_dec = 1L << 1,
_S_fixed = 1L << 2,
_S_hex = 1L << 3,
_S_internal = 1L << 4,
_S_left = 1L << 5,
_S_oct = 1L << 6,
_S_right = 1L << 7,
_S_scientific = 1L << 8,
_S_showbase = 1L << 9,
_S_showpoint = 1L << 10,
_S_showpos = 1L << 11,
_S_skipws = 1L << 12,
_S_unitbuf = 1L << 13,
_S_uppercase = 1L << 14,
_S_adjustfield = _S_left | _S_right | _S_internal,
_S_basefield = _S_dec | _S_oct | _S_hex,
_S_floatfield = _S_scientific | _S_fixed,
_S_ios_fmtflags_end = 1L << 16
};

但在那之后我们还看到:

    /// Insert/extract @c bool in alphabetic rather than numeric format.
static const fmtflags boolalpha = _S_boolalpha;

/// Converts integer input or generates integer output in decimal base.
static const fmtflags dec = _S_dec;

/// Generate floating-point output in fixed-point notation.
static const fmtflags fixed = _S_fixed;

/// Converts integer input or generates integer output in hexadecimal base.
static const fmtflags hex = _S_hex;

为什么除了枚举值之外,他们还使用 static const 来表示相同的值?为什么我们不能只使用枚举值?考虑到这些是 const 值,在这种情况下使用 static 不是浪费吗?

谢谢,提供

最佳答案

目标是分离接口(interface)和实现。 _Ios_Fmtflags 是实现定义的,将来可以更改,ios_base 不应显着依赖于 _Ios_Fmtflags,但必须提供一组常量作为记录接口(interface)的一部分 see comment .我们如何避免代码对内部 _Ios_Fmtflags 实现的依赖?我们可以使用 _Ios_Fmtflags 类型的同义词和这种类型的常量对象,这是进一步完成的:

typedef _Ios_Fmtflags fmtflags;
static const fmtflags boolalpha = _S_boolalpha;
static const fmtflags dec = _S_dec;

现在只有这些行依赖于特定的 _Ios_Fmtflags 实现。例如,我们可以重命名_S_boolalpha,它不会影响代码,只影响一行 static const fmtflags boolalpha = _S_boolalpha; 或者作为另一个例子,我们可以替换通过整数或其他一些合适的类型枚举 _Ios_Fmtflags。一种非常有用的技术,它使代码维护变得更加容易,尽管它增加了代码大小。

关于c++ - 为什么 Fmtflags 被指定两次 - 一次作为枚举的一部分,另一个实例作为静态常量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55291357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com