Подскажите побыстрому - объявить переменную в if как?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.03.21 20:34
Оценка: :)
Здравствуйте!

Хочу какое-то такое:


bool bGood  = false;
auto result = doSomething( &bGood );

if (bGood && /* тут надо преобразовать result в новую переменную нового типа, ну и ещё может проверок и преобразований */ )
{
    // ещё я хочу проверить result на empty() и если не empty, то вызвать конверсию в новый тип, и ещё раз проверить на валидность, и потом полученное использовать внутри if'а
    // Можно конечно наплодить if'ов и переменных до собсно блока, который обрабатывает данные, но хочется красиво

    // Do something with var
}


Курить доки что-то лень Может кто побыстрому подскажет, а?
Маньяк Робокряк колесит по городу
Re: Подскажите побыстрому - объявить переменную в if как?
От: Sm0ke Россия ksi
Дата: 01.03.21 21:38
Оценка:
Здравствуйте, Marty, Вы писали:

Это?

bool bGood  = false, var;

if(auto result = doSomething( &bGood ); bGood && !result.empty() && (var = static_cast<bool>(result)) ) {
    // Do something with var
}


Это вроде C++17 стандарт
Отредактировано 01.03.2021 21:38 Sm0ke . Предыдущая версия .
Re[2]: Подскажите побыстрому - объявить переменную в if как?
От: Muxa  
Дата: 01.03.21 21:49
Оценка:
S>Это вроде C++17 стандарт

А по-моему это фишка MSVC

bool bGood  = false, var;
if(!doSomething( &bGood, &var ).empty() && bGood) {
    // Do something with var
}

Re[2]: Подскажите побыстрому - объявить переменную в if как?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.03.21 22:01
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>
S>bool bGood  = false, var;

S>if(auto result = doSomething( &bGood ); bGood && !result.empty() && (var = static_cast<bool>(result)) ) {
S>    // Do something with var
S>}
S>


S>Это вроде C++17 стандарт


До чего техника дошла
';' в if'е в 17ом стандарте появилась?
Маньяк Робокряк колесит по городу
Re[2]: Подскажите побыстрому - объявить переменную в if как?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.03.21 22:46
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>
S>bool bGood  = false, var;

S>if(auto result = doSomething( &bGood ); bGood && !result.empty() && (var = static_cast<bool>(result)) ) {
S>    // Do something with var
S>}
S>


S>Это вроде C++17 стандарт


Вроде смог сформулировать в коде, но в один if не понял как затолкать всё:

            QDateTime dtLastDate;

            bool bOk = false;
            auto executedQuery = pDbMan->execHelper( selectLastDateQueryText, &bOk );

            if (bOk)
            {
                auto resVec = pDbMan->selectFirstResultToSingleStringVector(executedQuery);

                if (resVec.empty())
                {
                    // Ну нет, так нет
                }
                else
                {
                    dtLastDate = dateTimeFromDbString( resVec.front() );
                }
            }

            if (dtLastDate.isNull() || !dtLastDate.isValid())
            {
                // пытаемся получить dtLastDate ещё как-то
            }

            if (dtLastDate.isNull() || !dtLastDate.isValid())
            {
                // Вот тут уже мы поняли точно, что всё пошло не так
                continue;
            }

            // Ду Гуд Жоб Хере


Мне это всё не нравится а) чисто эстетически, б) потом это всё разрастётся в ветвистое говно
Маньяк Робокряк колесит по городу
Re[3]: Подскажите побыстрому - объявить переменную в if как?
От: K13 http://akvis.com
Дата: 02.03.21 06:59
Оценка: +1
M>Вроде смог сформулировать в коде, но в один if не понял как затолкать всё:

я бы делал обертки, возвращающие std::pair из самого результата и флага bool или даже std::optional

// тут я не в курсе, что там за типы
std::optional<QUERY_RES_TYPE> execHelperWrapper( DB_MGR *db, const QString& query )
{
    bool ok = false;
    auto qr = db->execHelper( query, &ok );
    return ok ? qr : std::nullopt;
}

std::optional<QString> selectFirstFieldOfFirstRowAsString( DB_MGR *db, const QString& query )
{
    auto qr = execHelperWrapper( db, query );
    if ( !qr )
        return std::nullopt;

    auto resVec = db->selectFirstResultToSingleStringVector( qr.value() );
    return !resVec.empty() ? resVec.front() : std::nullopt;
}

QDateTime dateTimeFromDbStringWrapper( std::optional<QString> s )
{
    QDateTime res;
    if ( s )
        res = dateTimeFromDbString( s.value() );
    return res;
}


и тогда получается

QDateTime dtLastDate = dateTimeFromDbStringWrapper( selectFirstFieldOfFirstRowAsString( pDbMan, selectLastDateQueryText ) );

if (dtLastDate.isNull() || !dtLastDate.isValid())
{
    // пытаемся получить dtLastDate ещё как-то
}

if (dtLastDate.isNull() || !dtLastDate.isValid())
{
    // Вот тут уже мы поняли точно, что всё пошло не так
    continue;
}

// Ду Гуд Жоб Хере
Re[4]: Подскажите побыстрому - объявить переменную в if как?
От: K13 http://akvis.com
Дата: 02.03.21 07:10
Оценка:
Не стоило "сокращать", запихивая в пост:

std::optional<QUERY_RES_TYPE> execHelperWrapper( DB_MGR *db, const QString& query )
{
    bool ok = false;
    auto qr = db->execHelper( query, &ok );
    //return ok ? qr : std::nullopt;
    if ( !qr )
        return std::nullopt;
    return qr;
}

std::optional<QString> selectFirstFieldOfFirstRowAsString( DB_MGR *db, const QString& query )
{
    auto qr = execHelperWrapper( db, query );
    if ( !qr )
        return std::nullopt;

    auto resVec = db->selectFirstResultToSingleStringVector( qr.value() );
    //return !resVec.empty() ? resVec.front() : std::nullopt;
    if ( resVec.empty() )
        return std::nullopt;
    return resVec.front();
}
Re[3]: Подскажите побыстрому - объявить переменную в if как?
От: _NN_ www.nemerleweb.com
Дата: 03.03.21 18:03
Оценка:
Здравствуйте, Marty, Вы писали:

M>До чего техника дошла

M>';' в if'е в 17ом стандарте появилась?

Да: https://en.cppreference.com/w/cpp/language/if
Если есть возможность то стоит перейти.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.