2011-04-06 27 views
0

我們對代碼中的幻數有很好的理解,但是有沒有一種好的,表達式和類型安全的方法來固化具有特殊含義的常量?我能想到的兩種可能的方式:C++整數類型:對特定值有特殊含義

方法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

我認爲「類型安全」是你的問題的一個問題。我認爲你正試圖通過使用數據類型強制來強制正確的使用。 Enum和好的命名是「足夠好」的。 – Jay 2011-04-06 19:43:14

+0

@Jay - 是的,你說的比我好。我想強制正確使用,最好隱藏魔法值。 – paperjam 2011-04-06 19:53:37

回答

4

我不同意你在方法1中做了什麼。不需要NumberOfThreads類型。這實際上是一個常量,「線程數」,數字是一個整數。所以這在我看來已經足夠且更具可讀性。

const int NumberOfThreads = 0; 
+0

是,如果大部分時間這是很好的,但開發人員可以欺騙並避免使用const int:你可能會看到有人寫'if(!numberOfThreads)...'而不是'if(numberOfThreads == automaticNumberOfThreads)...' – paperjam 2011-04-06 19:51:31

+1

@paperjam - 「Magic constant 「並不是強迫人們編寫好的代碼,而是要讓他們編寫可讀的代碼。你能避免爲'如果(numberOfThreads == 42)...',你不知道什麼42種手段。 – 2011-04-06 20:31:48

4

Enum基本上只是給數名隱藏用戶的價值。所以這應該很好。

+0

感謝您的鏈接,但我不認爲'enum'因爲沒有安全地從'int'轉換爲'enum'方式。 – paperjam 2011-04-06 20:10:13

+0

爲了安全起見,我要在這裏這個鏈接,如果您還沒有閱讀:http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.19 – 2011-04-06 23:13:13

0

此示例用法顯示強制執行的正確用法和隱藏在函數實現中的魔法值。

int numberOfThreads; 
/* ... */ 
numberOfThreads = automaticNumberOfThreads(); 
/* ... */ 
numberOfThreads = 1; 
/* ... */ 
numberOfThreads = 16; 
/* ... */ 
if (numberOfThreads == automaticNumberOfThreads()) 
{ 
    /* ... */