使用整数转换重载而不是布尔转换重载
Integer cast overload being used instead of bool cast overload
我想使用 bool cast 重载检查某些内容是否有效:
Menu::operator bool() const {
bool empty = false;
if (m_title == nullptr) {
empty = true;
}
return empty;
}
然而当我使用
if (Menu1) { cout << "valid"; }
它改用了 int cast overload
Menu::operator int()
{
int choice = option();
return choice;
}
对象Menu1
似乎不是常量对象。所以调用bool的转换运算符,需要转换一次const,而调用int的转换运算符,则不需要转换const。
将两个运算符声明为常量成员函数,并使它们(或至少是 int 的转换运算符)explicit
,如下面的演示程序所示:
#include <iostream>
struct A
{
int x = 0;
explicit operator int() const
{
std::cout << "operator int() const is called\n";
return x;
}
explicit operator bool() const
{
std::cout << "operator bool() const is called\n";
return x != 0;
}
};
int main()
{
A a = { 10 };
if ( a ) std::cout << a.x << '\n';
return 0;
}
程序输出为:
operator bool() const is called
10
您正在尝试的是上下文转换,在这种情况下,您的转换运算符需要是 well-formed。在标题为 "Contextual conversions".
的部分 "Implicit conversions" 下的 cppreference.com 中详细介绍了此特定场景
其实对于上面提到的场景,你只需要让你的转换运算符const
.
以下对我有用:
class Menu
{
int choice;
int mtitle;
public:
Menu(int a, int b):choice(a), mtitle(b){}
operator bool() const {
cout << "Calling op bool\n";
bool empty = false;
if (mtitle == 1) {
empty = true;
}
return empty;
}
operator int() const
{
cout << "Calling op int"<<"\n";
int choice = 2;
return choice;
}
};
int main()
{
Menu mymenu(12, 3);
if (mymenu)
cout << "valid\n";
}
或者,如果您不想对代码进行任何更改,则可以在 main()
中显式调用运算符,如下所示:
if (mymenu.operator bool())
cout << "Op Bool is called";
我想使用 bool cast 重载检查某些内容是否有效:
Menu::operator bool() const {
bool empty = false;
if (m_title == nullptr) {
empty = true;
}
return empty;
}
然而当我使用
if (Menu1) { cout << "valid"; }
它改用了 int cast overload
Menu::operator int()
{
int choice = option();
return choice;
}
对象Menu1
似乎不是常量对象。所以调用bool的转换运算符,需要转换一次const,而调用int的转换运算符,则不需要转换const。
将两个运算符声明为常量成员函数,并使它们(或至少是 int 的转换运算符)explicit
,如下面的演示程序所示:
#include <iostream>
struct A
{
int x = 0;
explicit operator int() const
{
std::cout << "operator int() const is called\n";
return x;
}
explicit operator bool() const
{
std::cout << "operator bool() const is called\n";
return x != 0;
}
};
int main()
{
A a = { 10 };
if ( a ) std::cout << a.x << '\n';
return 0;
}
程序输出为:
operator bool() const is called
10
您正在尝试的是上下文转换,在这种情况下,您的转换运算符需要是 well-formed。在标题为 "Contextual conversions".
的部分 "Implicit conversions" 下的 cppreference.com 中详细介绍了此特定场景其实对于上面提到的场景,你只需要让你的转换运算符const
.
以下对我有用:
class Menu
{
int choice;
int mtitle;
public:
Menu(int a, int b):choice(a), mtitle(b){}
operator bool() const {
cout << "Calling op bool\n";
bool empty = false;
if (mtitle == 1) {
empty = true;
}
return empty;
}
operator int() const
{
cout << "Calling op int"<<"\n";
int choice = 2;
return choice;
}
};
int main()
{
Menu mymenu(12, 3);
if (mymenu)
cout << "valid\n";
}
或者,如果您不想对代码进行任何更改,则可以在 main()
中显式调用运算符,如下所示:
if (mymenu.operator bool())
cout << "Op Bool is called";