Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 1
Регистрация: 01.04.2016
Сообщений: 116
1

Вызов функции в конце блока

22.03.2023, 10:51. Показов 438. Ответов 8

Author24 — интернет-сервис помощи студентам
Возможно ли реализовать авто вызов функции в условии, если функция например вернула true?

Например можно ли сделать так, чтобы каждый раз не писать func_end()?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool func()
{
   // какой-то код
}
 
void func_end()
{
   // какой-то код завершения, если func() вернула true
}
 
if (func)
{
   // какое-то действие
   func_end(); // вот это надо автоматически вызывать
}
Ещё пример, при "удачном" вызове tab_func() в конце каждый раз приходиться писать indent -= 3,
что неудобно да и забыть можно при нескольких вложенных функциях;
С помощью макросов, удаётся сделать более менее читабельный вид но всё равно это не то что хотелось бы.
Также были мысли по поводу декоратора, но мне кажется будет ещё хуже выглядеть.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
int indent = 0;
 
bool tab_func(int n)
{
    if (n % 2)
    {
        indent += 3;
        return true;
    }        
    else
    {
        return false;
    }
}
 
#define start(i) if (tab_func(i)) {
#define end   indent -= 3; }
 
int main()
{
    int i = 3;
 
    //! 1
    if (tab_func(i))
    {
        std::cout << std::string(indent, ' ') + "<after func 1 lev" << std::endl;
        if (tab_func(i))
        {
            std::cout << std::string(indent, ' ') + "<after func 2 lev" << std::endl;
            if (tab_func(i + 1))
            {
                std::cout << std::string(indent, ' ') + "<after func 3 lev>" << std::endl;
                indent -= 3;
            }
            std::cout << std::string(indent, ' ') + "after func 2 lev>" << std::endl;
            indent -= 3;
        }
        std::cout << std::string(indent, ' ') + "after func 1 lev>" << std::endl;
        indent -= 3;
    }
    
    std::cout << std::endl;
 
    //! 2
    start(i)
        std::cout << std::string(indent, ' ') + "<after func 1 lev" << std::endl;
        start(i)
            std::cout << std::string(indent, ' ') + "<after func 2 lev" << std::endl;
            start(i + 1)
                std::cout << std::string(indent, ' ') + "<after func 3 lev>" << std::endl;
            end
            std::cout << std::string(indent, ' ') + "after func 2 lev>" << std::endl;
        end
        std::cout << std::string(indent, ' ') + "after func 1 lev>" << std::endl;
    end
 
    std::cout << std::endl;
    std::cout << "Test string " << std::endl;
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2023, 10:51
Ответы с готовыми решениями:

Вызов функции описание которой находится в конце файла
Есть задание &quot;Написать программу, содержащую две функции. Первая функция, выводящая на экран строку...

Вызов функции с блока cond
Всем привет. Подскажите, пожалуйста, как правильно вызвать функцию с блока cond в mulisp ? ...

Вызов функции когда scroll опустится до нужного блока.
Вот есть scroll стандартный , в низу страницы есть какой то div , как сделать допустим чтобы когда...

Как задать вызов функции при загрузке страницы, но прописывать это в конце страницы?
Приветствую! Подскажите, пожалуйста, как задать вызов функции при загрузке страницы, но пропивать...

8
Злостный нарушитель
9540 / 5171 / 1181
Регистрация: 12.03.2015
Сообщений: 24,407
22.03.2023, 10:57 2
Цитата Сообщение от yurakir20 Посмотреть сообщение
Например можно ли сделать так, чтобы каждый раз не писать func_end()?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void func_end()
{
   // какой-то код завершения, если func() вернула true
}
 
bool func()
{
   bool result;
   
   // какой-то код
   
   if (result) func_end()
   return result;
}
0
2 / 2 / 1
Регистрация: 01.04.2016
Сообщений: 116
22.03.2023, 11:06  [ТС] 3
Забыл уточнить, что завершающая функция должна вызываться после а не до.
0
Злостный нарушитель
9540 / 5171 / 1181
Регистрация: 12.03.2015
Сообщений: 24,407
22.03.2023, 11:12 4
Цитата Сообщение от yurakir20 Посмотреть сообщение
Забыл уточнить, что завершающая функция должна вызываться после а не до.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bool func()
{
   // какой-то код
}
 
void feature()
{
  if (func())
  {
     // какое-то действие
     // какой-то код завершения, если func() вернула true
  }
}
0
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
22.03.2023, 11:18 5
Цитата Сообщение от yurakir20 Посмотреть сообщение
#define end   indent -= 3; }
с таким макросом прилетит привет от STL контейнеров

по теме:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool func()
{
   bool result=[]
   {
      bool result{};
 
      // какой-то код
 
      return result;
   }();
   
   if (result) func_end();
   return result;
}
1
2 / 2 / 1
Регистрация: 01.04.2016
Сообщений: 116
22.03.2023, 13:46  [ТС] 6
Тоже не то, func_end() срабатывает сразу, а не в теле условия
C++
1
2
3
4
5
    if (func(...))
    {
        // Тут разный код, а может быть ещё один вложенный вызов if (func(...))
        // Должна сработать в конце func_end()
    };
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// Переменная которая изменяется только в func_find() и func_end()
int value = 0;
 
// Функция которую нельзя изменять
void func_end()
{
    value--;
}
 
// Функция которую нельзя изменять
bool func_find(const char* t)
{
    if ("12345" == t)
    {
        value++;
        return true;
    }
    else
    {
        return false;
    }
}
 
bool func(const char* t)
{
    bool find = [&t]
    {
        if (func_find(t))
        {
            //std::cout << "True" << std::endl;
            return true;
        }
        else
        {
            //std::cout << "False" << std::endl;
            return false;
        }
    }();
 
    if (find) func_end();
    return find;
}
 
int main()
{
    std::cout << "value: " << value << std::endl;
    // Тут идут вложенные по разному вызовы
    if (func("12345"))
    {
        // Код №1
        // Должно быть "++ code number 1, value  : 1"
        std::cout << "++ code nubmer 1, value  : " << value << std::endl;
        if (func("12345"))
        {
            // Код №2
            // Должно быть "++ code number 2, value  : 2"
            std::cout << "++ code number 2, value  : " << value << std::endl;
            if (func("123456"))
            {
                // Код №3
                // Должно быть "++ code number 3, value  : 3"
                std::cout << "++ code number 3, value  : " << value << std::endl;
            }
        }
    }
    std::cout << "value  : " << value << std::endl;
 
    return 0;
}
0
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
22.03.2023, 13:55 7
что-то я не понял. Вот это нужно, судя по первому посту
Цитата Сообщение от yurakir20 Посмотреть сообщение
Возможно ли реализовать авто вызов функции в условии, если функция например вернула true?
лямбда это обеспечивает

Добавлено через 27 секунд
или я что-то не понимаю ?

Добавлено через 1 минуту
Цитата Сообщение от yurakir20 Посмотреть сообщение
if ("12345" == t)
такое сравнение не будет работать правильно
0
2 / 2 / 1
Регистрация: 01.04.2016
Сообщений: 116
23.03.2023, 09:56  [ТС] 8
В начале наверное не всё уточнил. В общем мне нужно чтобы если вызывалась неизменяемая функция func() с результатом
true, выполнить свой код в блоке проверки её на true (код будет разный) и только после этого кода должна быть вызвана
неизменяемая функция func_end(). Неизменяемая в смысле что это функция сторонней библиотеки в которую доступа нет.
Названия функций вымышленные, просто для примера. Проверка if ("12345" == t) это иллюстрация что функция что-то делает, а не конкретное действие. В общем мне нужно что-то вроде обёртки условия. По идее можно присобачить try/finnaly или макросы, но мне нужно удобство, т.к. таких блоков может быть 10 со сложной структурой вложения.

Можно конечно в лоб писать как в примере ниже, но очень легко потерять вызов func_end() и получить ошибку.
Или вызвать не в том месте завершающую функцию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if (func(...))
{
    if (func(...))
    {
        //Код 1
        if (func(...))
        {
            //Код 2
            func_end();
        }
        if (func(...))
        {
           if (func(...))
           {
               //Код 3
               func_end();
           }
            func_end();
        }
        func_end();
    }
    func_end();
}
if (func(...))
{
    //Код 4
    func_end();
}
0
фрилансер
5843 / 5372 / 1102
Регистрация: 11.10.2019
Сообщений: 14,345
23.03.2023, 10:17 9
Цитата Сообщение от yurakir20 Посмотреть сообщение
легко потерять вызов func_end()
дык, тут всё просто. Экземпляр класса, в деструкторе которого произойдёт вызов

Добавлено через 5 минут
yurakir20, https://onlinegdb.com/Jc6PNt5hB

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
 
void func_end()
{
    std::cout<<"func_end"<<'\n';
}
 
struct EndCaller
{
    ~EndCaller()
    {
        func_end();
    }
};
 
bool func()
{
    return true;
}
 
int main()
{
    if (func())
    {
        EndCaller ec;
        if (func())
        {
            EndCaller ec;
            //Код 1
            if (func())
            {
                EndCaller ec;
                //Код 2
            }
            if (func())
            {
                EndCaller ec;
                if (func())
                {
                    EndCaller ec;
                    //Код 3
                }
            }
        }
    }
    if (func())
    {
        EndCaller ec;
        
        //Код 4
    }
 
    return 0;
}
func_end
func_end
func_end
func_end
func_end
func_end


Добавлено через 1 минуту
Цитата Сообщение от Алексей1153 Посмотреть сообщение
if (func())
    {
        EndCaller ec;
//Код 4
    }
а повтор такой конструкции наводит на мысль, что func должна возвращать объект, внутри которого будет и результат возврата, и ресурс, и вызов func_end в деструкторе. Тогда всё будет ещё красивше

Добавлено через 2 минуты
yurakir20, вроде такого
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
 
void func_end()
{
    std::cout<<"func_end"<<'\n';
}
 
struct MyObject
{
    bool result{};
    
    constexpr operator bool()const noexcept
    {
        return result;
    }
    
    ~MyObject()
    {
        if(result)
        {
            func_end();
        }
    }
};
 
MyObject func()
{
    MyObject o;
    o.result=true;
    
    return o;
}
 
int main()
{
    if (auto o=func())
    {
        if (auto o1=func())
        {
            //o1. ...;
            
            //Код 1
            if (auto o2=func())
            {
                //o2. ...;
                
                //Код 2
            }
            if (auto o3=func())
            {
                if (func())
                {
                    //o3. ...;
                    
                    //Код 3
                }
            }
        }
    }
    if (auto o4=func())
    {
        //o4. ...;
        
        //Код 4
    }
 
    return 0;
}
1
23.03.2023, 10:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2023, 10:17
Помогаю со студенческими работами здесь

Протокол MODBUS. Не работает вызов вызов функции из подключенной библиотеки DLL внутри функции purebasic
Доброго дня всем. Задача определить ip подключенного устройства. При работе непосредственно из...

';' в конце блока метода?
class foo { void print(){} void draw() { bla = bla^2; cout &lt;&lt;...

Ромбик на конце div-блока
Всем привет, Столкнулся с такой задачей... Мне нужно создать такой div-блок средствами html и...

Вызов атрибута вначале метода и в конце
Здравствуйте. Есть некий метод, к примеру private void UpdateData() { } Выполняется он в...

Вызов блока
Всем привет! Подскажите как мне с помощью js вызвать определенный блок. Вообщем ситуация такая в...

Вызов блока с контентом
Доброго дня! Пожалуйста подскажите с решением вопроса. На работе для внутреннего пользования...

Вызов метки из блока else
Если кратко, то главная суть задачи - перевести буквы строки в нижний регистр.(Почему именно cmd?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru