[英]C++ implicit conversion to bool
為了使我的枚舉更加類型安全,我一直在使用宏生成的重載運算符來禁止將枚舉與除了相同類型的枚舉之外的任何內容進行比較:
#include <boost/static_assert.hpp>
#define MAKE_ENUM_OPERATOR_TYPESAFE(enumtype, op) \
template<typename T> \
inline bool operator op(enumtype lhs, T rhs) \
{ \
BOOST_STATIC_ASSERT(sizeof(T) == 0); \
return false; \
} \
\
template<> \
inline bool operator op(enumtype lhs, enumtype rhs) \
{ \
return static_cast<int>(lhs) op static_cast<int>(rhs); \
}
#define MAKE_ENUM_TYPESAFE(enumtype) \
MAKE_ENUM_OPERATOR_TYPESAFE(enumtype, ==) \
MAKE_ENUM_OPERATOR_TYPESAFE(enumtype, !=) \
MAKE_ENUM_OPERATOR_TYPESAFE(enumtype, >) \
MAKE_ENUM_OPERATOR_TYPESAFE(enumtype, <) \
MAKE_ENUM_OPERATOR_TYPESAFE(enumtype, >=) \
MAKE_ENUM_OPERATOR_TYPESAFE(enumtype, <=)
// Sample usage:
enum ColorType { NO_COLOR, RED, BLUE, GREEN };
MAKE_ENUM_TYPESAFE(ColorType)
這通常具有期望的效果; 形式color_variable == RED
工作的比較,而形式color_variable == 1
比較由於Boost.StaticAssert而產生編譯時錯誤。 (這是一個不錯的方法嗎?)
但是,我的編譯器(CodeGear C ++ Builder)也試圖使用這些重載的運算符來實現隱式bool
轉換。 例如, if (color_variable) { ... }
被轉換為if (operator!=(color_variable, 0)) { ... }
並且正在觸發BOOST_STATIC_ASSERT
並且無法編譯。
我很確定這是我的編譯器不正確的行為(例如,Comeau和GCC沒有這樣做)但是想知道是否有任何語言律師可以確認。 我自己試着查看C ++ 0x草案標准,但我能找到的只是4.12節下面的聲明:
零值,空指針值或空成員指針值轉換為false; 任何其他值都轉換為true。
沒有關於如何檢查“零值”的細節。
你為什么不使用像下面這樣的課程?
template<class Enum>
class ClassEnum
{
public:
explicit ClassEnum(Enum value) : value(value) {}
inline bool operator ==(ClassEnum rhs) { return value == rhs.value; }
inline bool operator !=(ClassEnum rhs) { return value != rhs.value; }
inline bool operator <=(ClassEnum rhs) { return value <= rhs.value; }
inline bool operator >=(ClassEnum rhs) { return value >= rhs.value; }
inline bool operator <(ClassEnum rhs) { return value < rhs.value; }
inline bool operator >(ClassEnum rhs) { return value > rhs.value; }
// Other operators...
private:
Enum value;
}
enum ColorTypeEnum { NO_COLOR, RED, BLUE, GREEN };
typedef ClassEnum<ColorTypeEnum> ColorType;
對於ClassEnum<ColorTypeEnum>
沒有隱式轉換為bool。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.