c++整型:特定值的特殊含义
C++ integer type: special meaning for certain values
我们被警告不要在代码中使用幻数,这是有充分理由的,但是有没有一种好的、有表现力的、类型安全的方法来固化具有特殊含义的常量呢?我能想到两种可能的方法:
方法1:typedef int NumberOfThreads;
const NumberOfThreads automaticNumberOfThreads = 0;
方法2:class NumberOfThreads
{
NumberOfThreads(int n) : value(n) {}
static NumberOfThreads automatic() { return NumberOfThreads(0); }
bool isAutomatic() const { return value == automatic(); }
int value;
};
我并不是真的想要一个复杂类型,但我确实希望我的特殊值与该类型紧密地联系在一起。在方法1中,它不是,懒惰的用户可能只是硬编码分配或比较到0
。
对于与整数值差不多的东西来说,方法2似乎有点沉重。
问题可以扩展到非整数类型和多个特殊值。
也许enum
是可能的?
我意识到我可以隐藏的值从用户通过使用extern
在我的头文件
我不同意你在方法一中的做法。不需要NumberOfThreads类型。这实际上是一个常数,"线程数",这个数字是一个整数。在我看来,这已经足够了,而且可读性更强。
const int NumberOfThreads = 0;
Enum基本上只是给数字命名。应该没问题
这个示例用法显示了在函数的实现中强制执行的正确用法和隐藏的魔法值。
int numberOfThreads;
/* ... */
numberOfThreads = automaticNumberOfThreads();
/* ... */
numberOfThreads = 1;
/* ... */
numberOfThreads = 16;
/* ... */
if (numberOfThreads == automaticNumberOfThreads())
{
/* ... */
相关文章:
- C 字符串返回字符串的整数/双精度/长整型值
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 将长整型值打印为带有前导零的十六进制
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 将整型常量映射到类型
- 将元组和整型实例合并到引用元组中
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 为什么C++不允许两个同名的函数/类模板,区别仅在于非类型模板参数(整型)的类型?
- 将最小值整数转换为无符号长整型
- 如何将小端格式的QByteArray转换为无符号长整型
- 直接初始化无符号短整型的标准行为
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 无符号和有符号短整型的位宽
- 将整型转换为浮点型时检测溢出
- 环礁和(长整型)的区别?
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?
- 将逗号格式化为长整型整数
- 如何将长整型传递给 itoa 函数?