我一直在爭取一整天,找到一個真正的最佳解決方案,但似乎並沒有一個。我需要我的枚舉是
- 不隱式轉換爲整型
- 可用在
switch
聲明
- 可用作非類型模板參數
在紛紛拿出以下碼,在霍華德Hinnant(欣南特)的解決方案內置:
struct DataType
{
struct integral {
enum type { None, Single, Double, Int };
};
typedef typename integral::type integral_type;
explicit DataType(integral_type v) : val(v) {}
integral_type integral_value() const { return val; }
bool operator==(const DataType& s) const { return val == s.val; }
bool operator!=(const DataType& s) const { return val != s.val; }
static const DataType None;
static const DataType Single;
static const DataType Double;
static const DataType Int;
private:
integral_type val;
};
在.cpp
文件:
const DataType DataType::None (DataType::integral::None);
const DataType DataType::Single (DataType::integral::Single);
const DataType DataType::Double (DataType::integral::Double);
const DataType DataType::Int (DataType::integral::Int);
作爲非類型模板參數:
template <DataType::integral_type>
struct DataTypeTraits;
template <>
struct DataTypeTraits<DataType::integral::Single>
{
enum { size = 4 };
};
在開關:
size_t get_size(DataType type)
{
switch (type.integral_value()) {
case DataType::integral::Single: return DataTypeTraits<DataType::integral::Single>::size;
case DataType::integral::Double: return DataTypeTraits<DataType::integral::Double>::size;
case DataType::integral::Int: return DataTypeTraits<DataType::integral::Int>::size;
default: throw std::logic_error("Unknown data type.");
}
}
不是特別大,但是這是好得不能再好,我猜。 ..
這是一種模式?你爲什麼認爲這是一個黑客?它很整潔。 – Inverse 2011-02-12 21:09:23
@反:如果你反覆使用它會成爲一種模式:-)。在結構體或命名空間中枚舉枚舉以防止名稱空間污染是一種常用技術,我一直使用(主要是)。使用隱式轉換來允許使用封裝結構,就好像它是枚舉一樣,這不是一種常見模式,至少在我沒有閱讀過的任何代碼中都是如此。由於隱含轉換,我對此保持警惕:我不斷髮現隱式轉換允許您編寫細微代碼的不同方式...... – 2011-02-13 15:14:50