大佬教程收集整理的这篇文章主要介绍了C隐式转换为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转换.例如,如果(color_variablE){…}被转换为if(operator!=(color_variable,0)){…}并触发BOOST_STATIC_ASSERT并且无法编译.
我相当肯定,这是我的编译器(Comeau和GCC不这样做)的错误行为,但是想知道有没有任何语言律师可以确认.我试着自己查看C 0x草案标准,但我可以找到的是根据第4.12节的以下声明:
没有关于如何检查“零值”的细节.
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,GREEN }; typedef ClassEnum<ColorTypeEnum> ColorType;
ClassEnum< ColorTypeEnum>没有隐式转换为bool.
以上是大佬教程为你收集整理的C隐式转换为bool全部内容,希望文章能够帮你解决C隐式转换为bool所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。