如何解决如果语句是如何调用 boolean_type 运算符的?
我有一个头文件,它定义了一个包含 boolean_type
转换运算符的类,它在 main.cpp
中使用。我无法理解如何在 boolean_type
语句中调用 if
运算符
标题.h
template <typename Type>
class Sptr
{
public:
struct boolean_struct { int member; };
typedef int boolean_struct::* boolean_type;
operator boolean_type() const throw()
{
return nullptr != m_value ? &boolean_struct::member : nullptr;
}
explicit Sptr(Type value = nullptr) throw() :
m_value(value)
{
}
private:
Type m_value;
};
main.cpp
int main()
{
int* p = new int;
Sptr<int*> sPtr(p);
if (sPtr) //>>>>> How this is calling operator boolean_type() ?
{
std::cout << "hellos";
}
}
解决方法
C++ 很乐意让一个构造工作,只要它可以(在某些约束内)找到一个有效的转换序列到在给定上下文中工作的类型。
在这种情况下,编译器看到一个 internal var endArray = setEnd(totLine,totTurn,startTurn)
resultTextView1.text = "A"
if (endArray.component1()) resultTextView1.setTextColor(Color.GREEN)
resultTextView2.text = "B"
if (totLine<2) resultTextView2.visibility = View.GONE
if (endArray.component2()) resultTextView2.setTextColor(Color.GREEN)
resultTextView3.text = "C"
if (totLine<3) resultTextView3.visibility = View.GONE
if (endArray.component3()) resultTextView3.setTextColor(Color.GREEN)
resultTextView4.text = "D"
if (totLine<4) resultTextView4.visibility = View.GONE
if (endArray.component4()) resultTextView4.setTextColor(Color.GREEN)
resultTextView5.text = "E"
if (totLine<5) resultTextView5.visibility = View.GONE
if (endArray.component5()) resultTextView5.setTextColor(Color.GREEN)
resultTextView6.text = "F"
if (totLine<6) resultTextView6.visibility = View.GONE
if (endArray.elementAt(6)) resultTextView6.setTextColor(Color.GREEN) //NOT WORKING
fun setEnd(totLine: Int,totTurn: Int,startTurn: Int): Array<Boolean> {
//internal var totLine: Int = 4 // total no of lines
//internal var totTurn: Int = 2 // no of turns
//internal var startTurn: Int = 1 // which turn starts first
var textA = false
var textB = false
var textC = false
var textD = false
var textE = false
var textF = false
var totLtr: Int = totLine / totTurn // no archers per line
if(startTurn==1) {
if (totLtr == 1) textA = true
if (totLtr == 2) {
textA = true
textB = true
}
if (totLtr == 3) {
textA = true
textB = true
textC = true
}
}
if(startTurn==2) {
if (totLtr == 1) textB = true
if (totLtr == 2) {
textC = true
textD = true
}
if (totLtr == 3) {
textD = true
textE = true
textF = true
}
}
if(startTurn==3) {
if (totLtr == 1) textC = true
if (totLtr == 2) {
textE = true
textF = true
}
}
return arrayOf(textA,textB,textC,textD,textE,textF)
}
语句,它需要一个 if
类型的运算符。因此,它会尝试从 bool
形成一个 bool
值。一个转换序列最多可以由一个用户定义的转换构成,但可能包含更多的标准转换。
在这种情况下,序列中的第一个转换是用户定义的转换为 sPtr
。之后,我们可以进行以下标准转换
[conv.bool](强调我的)
1 算术、无作用域枚举、指针或成员指针类型的纯右值可以转换为 boolean_type
类型的纯右值。零值、空指针值或空成员指针值被转换为bool
;任何其他值都转换为 false
。
true
是一个 pointer-to-member type。因此可以转换为 boolean_type
使 bool
语句起作用所需的 if
。
此类代码可能在过去编写的原因在此答案的第一段中。 C++ 可以太转换快乐了。如果用户定义的转换是一个简单的 operator bool
,那么最终可能会像这样的愚蠢
sPtr * 2; // What is multiplying a pointer even mean!? Why?
foo(sPtr); // But foo expects an int!
到 bool
的转换允许在需要整数类型的上下文中使用 sPtr
,因为实际上,bool
在 C++ 类型系统中也是整数类型!我们不想那样。所以上面的技巧被用来防止编译器在比我们想要的更多的上下文中考虑我们的用户定义的转换。
如今,不需要这些技巧。从 C++11 开始,类型的概念是 contextually converted and explicit
conversion operators。基本上如果我们改写
explicit operator bool()
只会在非常特定的上下文中调用此运算符(例如 if
语句中的条件),但不会在上面列出的有问题的示例中隐式调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。