我们在有充分理由的情况下警告代码中的幻数,但是有一种良好的,富有表现力和类型安全的方法来巩固具有特殊含义的常量吗?我可以想到两种可能的方式:
方法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
隐藏用户的值
答案 0 :(得分:4)
Enum基本上只是给出数字名称。所以这应该可以正常工作。
答案 1 :(得分:4)
我不同意你在方法1中所做的事情。不需要NumberOfThreads类型。实际上这是一个常量,“线程数”,数字是整数。所以这在我看来已经足够且更具可读性。
const int NumberOfThreads = 0;
答案 2 :(得分:0)
此示例用法显示了在函数实现中隐藏的正确使用强制和魔术值。
int numberOfThreads;
/* ... */
numberOfThreads = automaticNumberOfThreads();
/* ... */
numberOfThreads = 1;
/* ... */
numberOfThreads = 16;
/* ... */
if (numberOfThreads == automaticNumberOfThreads())
{
/* ... */