Как я могу выполнить функцию чисто от статуса возврата успеха двух других функций? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть одна функция, которая основана на успешном возвращении статусов двух других функций.Т.е. если какая-либо функция является ошибкой, третья функция должна обновить что-то внутри себя, чтобы отразить это, но все же продолжить.Есть ли чистый способ выполнить эту третью функцию, не будучи избыточным?

В моем случае у меня есть следующее, где func1 и func2 возвращают либо успех, либо неудачу:

bool status;
bool status2;
status = func1();
status2 = func2();
if (status && status2){
 func3(other_args,true)
else func3(other_args, false);

И я чувствую, что это не совсем хорошо.Мой func3 записывает множество информации и полагается на то, что любая из проведенных операций провалилась.Есть ли более чистый способ реализовать этот третий вызов функции?

Мои первые мысли были:

if (func1 && func2){
    func3(some_other_args, true)
else func3(some_other_args, false)

Это правильное мышление или здесь что-то намного чище?

Ответы [ 4 ]

0 голосов
/ 14 мая 2018

Может быть, другие способы C ++: передать func1() и func2() себя в func3(), который также заботится о статусах возврата функции, например:

void func3(other_args i, decltype(func1) f1, decltype(func2) f2){
    if (f1() && f2()) { 
        //do true 
    }
    else {
        //do false
    }   
}

Таким образом, func3() вызов становится болееочиститель:

func3(other_args, func1, func2);
0 голосов
/ 14 мая 2018

В вашем случае вы можете просто написать:

auto status = func1();
auto status2 = func2();
func3(other_args, status && status2);

Или, может быть, я не совсем понимаю ваш вопрос

0 голосов
/ 14 мая 2018

Поскольку вы действительно хотите получить оба результата, то , если , порядок выполнения не важен для вас, самое короткое, что вы можете получить, это не замкнуть накоротко:

func3(other_args, func1() & func2());

но это подвержено ошибочному исправлению ошибки ("verschlimmbessern" на немецком языке), когда вы возвращаетесь к коду через несколько недель и "исправляете" соединение.

Более надежное решение -

auto status = func1();
auto status2 = func2();
func3(other_args, status && status2);
0 голосов
/ 14 мая 2018

Просто передайте условие в качестве параметра, чтобы избежать ветвления.

status = func1();
status2 = func2();
func3(other_args, (status && status2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...