Информация об изменениях

Сообщение Re[3]: Создать переменную со скопом для if от 10.04.2018 20:08

Изменено 10.04.2018 20:29 Marty

Re[3]: Создать переменную со скопом для if
Здравствуйте, Marty, Вы писали:

Хотя, дошло. Нужно было лишь немного подумать, и получилось

Остался вопрос — смутно помню, почему-то в подобных случаях рекомендовалось перегружать и operator void* (или вместо operator bool, или совместно с ним). Не напомните, в чем там хитрость, если вообще есть?

Код:
#include <iostream>
using namespace std;


struct A
{
    bool bValid;
    int  value;
    bool isValid() { return bValid; }
    
    A(bool b = false) : bValid(b) {}
    A(int v) : bValid(true), value(v)  {} 
    
    operator bool() const
    {
        return bValid;
    }

};

A foo()
{
    return 5;    
}

A bar()
{
    return false;
}

int main() {

    if (auto a = foo())
    {
        cout<<"a = "<<a.value<<"\n";
    }
    else
    {
        cout<<"a is not valid\n";
    }

    if (auto b = bar())
    {
        cout<<"b = "<<b.value<<"\n";
    }
    else
    {
        cout<<"b is not valid\n";
    }
    
    return 0;
}


Надо еще на C++11 проверить, работает ли.
Re[3]: Создать переменную со скопом для if
Здравствуйте, Marty, Вы писали:

Хотя, дошло. Нужно было лишь немного подумать, и получилось

Остался вопрос — смутно помню, почему-то в подобных случаях рекомендовалось перегружать и operator void* (или вместо operator bool, или совместно с ним). Не напомните, в чем там хитрость, если вообще есть?

Код:
#include <iostream>
using namespace std;


struct A
{
    bool bValid;
    int  value;
    bool isValid() { return bValid; }
    
    A(bool b = false) : bValid(b) {}
    A(int v) : bValid(true), value(v)  {} 
    
    operator bool() const
    {
        return bValid;
    }

};

A foo()
{
    return 5;    
}

A bar()
{
    return false;
}

int main() {

    if (auto a = foo())
    {
        cout<<"a = "<<a.value<<"\n";
    }
    else
    {
        cout<<"a is not valid\n";
    }

    if (auto b = bar())
    {
        cout<<"b = "<<b.value<<"\n";
    }
    else
    {
        cout<<"b is not valid\n";
    }
    
    return 0;
}


Надо еще на C++11 проверить, работает ли.