gpt4 book ai didi

C++ 隐式转换为 bool

转载 作者:可可西里 更新时间:2023-11-01 16:18:33 24 4
gpt4 key购买 nike

为了使我的枚举更加类型安全,我一直在使用宏生成的重载运算符来禁止将枚举与除相同类型的枚举之外的任何东西进行比较:

#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 节下的以下声明:

A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to 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 .

关于C++ 隐式转换为 bool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1667822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com