c++整型:特定值的特殊含义

C++ integer type: special meaning for certain values

本文关键字:整型 c++      更新时间:2023-10-16

我们被警告不要在代码中使用幻数,这是有充分理由的,但是有没有一种好的、有表现力的、类型安全的方法来固化具有特殊含义的常量呢?我能想到两种可能的方法:

方法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())
{
    /* ... */