将结构求值为布尔
Evaluate struct as a bool
我一直在用c++将结构求值为布尔
struct foo {
int bar;
};
foo* x = (foo*)malloc(sizeof(foo));
int y = ( x ) ? 3 : 4;
这就是运行时发生的情况:
could not convert 'x' from 'foo' to 'bool'
在搜索布尔运算符时,我只能找到重载比较器布尔运算符的方法。是否存在作为布尔运算符的直接求值结构?
如果可能的话,我还希望将foo保留为普通的旧数据。
这不可能是该错误的正确代码。该错误指出,它无法将x
从foo
转换为bool
,但x
是而不是foo
,它是foo*
。并且foo*
可以转换为bool1,所以您给出的代码不会有错误。
如果您希望能够使用foo
对象作为条件,则需要为foo
类提供operator bool
成员函数:
struct foo {
int bar;
operator bool() { return true; }
};
foo x;
int y = x ? 3 : 4;
在这种情况下,任何foo
都将始终计算为true
。这种到bool
的转换被认为是"不安全的",因为您的对象可能在某些意外的地方被转换为bool
。为了解决这个问题,在C++03中,您可以使用安全布尔习惯用法,在C++11中,您可以将operator bool
标记为explicit
:
struct foo {
int bar;
explicit operator bool() { return true; }
};
explicit operator bool
仍将在某些地方自动使用,例如if
语句和while
循环中的条件。还有其他的答案涵盖了这一点。
1算术、无范围枚举、指针或指向成员类型的指针的prvalue可以转换为
bool
类型的prvalue。零值、空指针值或空成员指针值被转换为false
;任何其它值被转换为CCD_ 22。
没有直接的评估结构即布尔运算符。这就是为什么有一种方法给一个结构一个operator bool
方法。它告诉编译器在bool
上下文中使用给定结构类型的值时如何解释该值。
不过,您显示的代码不会使用这样的运算符,因为该运算符适用于结构,而不是指向结构的指针;您的表达式类型为foo*
,而不是foo
。指针会自动转换为bool
,因为这是编译器知道如何执行的内在转换。空指针为false,非空指针为true。问题中显示的代码永远不会产生报告的错误消息。
如果在编译器需要bool
的地方确实有一个结构,并且由于任何原因都不能给该结构一个operator bool
方法,那么可以用老式的方法执行转换,并使用一个普通函数:
bool interpret_foo_as_bool(foo const& f);
根据需要实现函数,然后调用它,传递foo
值。例如:
foo* x = ...;
int y = interpret_foo_as_bool(*x) ? 3 : 4;
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 将结构转换为布尔值
- 带有布尔数组成员的 C++ 结构.如何在主代码中使用
- 给定仅包含布尔类型成员的结构的两个对象 s1 和 s2,只要 s1 的成员为 true,请检查 s2 的每个成员是否为真
- 将结构求值为布尔
- 封送包含布尔值的复杂嵌套结构
- "选择<布尔,类型名,类型名>"是否有标准结构?
- 如何根据布尔类型成员函数的返回值调用结构成员函数
- 如何使用std::map将布尔映射到三维点结构
- 在MFC中实现一个布尔表结构
- 处理布尔代数方程的良好数据结构是什么?