使用整数转换重载而不是布尔转换重载

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";