2011-05-05 61 views
1

我有C++類的混合,其中一些將狀態變量0..9存儲爲整數,其他使用'0'...'9'。目前我這樣做:使用枚舉進行類型檢查 - 如何正確範圍

enum { kOne = '1' }; 
class StoresValueAsInt { 
    static int value; // contains 0 ... 9 
}; 
class StoresValueAsChar { 
    static char value; // contains '0' ... '9' 
}; 
class StoresValueAsChar { 
    static char value; 
}; 

template <typename X> 
isOne() { return X::value == kOne; } 

這使我可以寫出錯誤代碼isOne<StoresValueAsInt::value>()。相反,我想讓編譯器抱怨這種不正確的用法。我試過如下:

enum ValueInt { 
    kOne = 1 
}; 
enum ValueChar { 
    kOne = '1' 
}; 

class StoresValueAsInt { 
    static ValueInt value; 
}; 
class StoresValueAsChar { 
    static ValueChar value; 
}; 
class StoresValueAsChar2 { 
    static ValueChar value; 
}; 

然而,這不起作用,因爲通力是可見的命名空間級別,因此它具有通力衝突的聲明。

有沒有辦法在命名空間中聲明枚舉?或者更好的方法在這裏?

已更新:增加了我目前所做的;希望澄清我的用例。

+0

編譯器不會抱怨'char'和'INT之間的比較'因爲'char'是一個'unsigned int'(或者在某些系統上是'unsigned short') – Chad 2011-05-05 20:35:35

+0

是的,那麼編譯器不會抱怨第一個版本中的錯誤。這就是爲什麼我想定義枚舉來進行類型檢查的原因;編譯器會認爲ValueInt和ValueChar是不同的... – hrr 2011-05-06 02:29:24

+0

看我的解決方案然後 – Chad 2011-05-06 02:40:48

回答

3

就最佳實踐而言,我真的不確定你在這裏試圖完成什麼,所以我不能指出你在正確的方向。

然而,直接回答你的問題:在單獨的命名空間中放置枚舉將解決您的問題:

namespace IntVals { 
    enum ValueInt { 
     kOne = 1 
    }; 
} 
namespace CharVals { 
    enum ValueChar { 
     kOne = '1' 
    }; 
} 

class StoresValueAsInt { 
    static ValueInt value; 
}; 
class StoresValueAsChar { 
    static ValueChar value; 
}; 

那麼你應該能夠使用以下命令:

StoresValueAsInt::value == CharVals::kOne 

雖然這是醜陋的,我希望我能更好地理解你將提供比這更優雅的解決方案。

1

有沒有辦法在命名空間中聲明枚舉?或者更好的方法在這裏?

是的,你可以區分你的枚舉如下:

struct ValueInt { 
    enum { // no need to have enum Name 
    kOne = 1 
    }; 
}; 
struct ValueChar { 
    enum { // no need to have enum Name 
    kOne = '1' 
    }; 
}; 

用法:

ValueInt::kOne; 
ValueChar::kOne;