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

Создать новую функцию во время выполнения

07.01.2016, 07:38. Показов 437. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть код, где одна функция возвращает другую функцию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <functional>
 
std::function<int()> gen_clo() {
    return []() { static int x = 0; return ++x; };
}
 
int main() {
    std::function<int()> clo1 = gen_clo();
    std::function<int()> clo2 = gen_clo();
 
    std::cout << clo1() << std::endl;
    std::cout << clo1() << std::endl;
    std::cout << clo1() << std::endl;
 
    std::cout << clo2() << std::endl;
    std::cout << clo2() << std::endl;
}
Если запустить этот код на выполнение, получим что выведется.
Bash
1
2
3
4
5
1
2
3
4
5
А хотелось бы, чтобы выводилось (при каждом создании новое x):
Bash
1
2
3
4
5
1
2
3
1
2
То есть, как я понимаю, эта лямбда, она создается один раз на этапе компиляции и потом возвращается один и тот-же экземпляр? Как можно возвращать разные экземпляры и будут ли они разрушаться при выходе из некоторой области?

Я бы хотел сделать код, эквивалентный, в каком-то смысле, следующему коду на lisp:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(defun gen-clo ()
    (let ((x 0))
        (lambda ()
            (
                progn
                    (setf x (+ x 1))
                    x
            )
        )
    )
)
 
(setf clo1 (gen-clo) clo2 (gen-clo))
(format t "~a~%" (funcall clo1))
(format t "~a~%" (funcall clo1))
(format t "~a~%" (funcall clo1))
(format t "~a~%" (funcall clo2))
(format t "~a~%" (funcall clo2))
Вывод:
Bash
1
2
3
4
5
1
2
3
1
2
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2016, 07:38
Ответы с готовыми решениями:

Возможно ли создать виртуальную и в то же время дружественную функцию при насследовании?
Хотелось бы чтобы при выводе разных классов вызывались разные функции, то есть функции именно этого...

Как создать новую таблицу в базе данных во время выполнения программы?
Как создать новую таблицу в базе данных во время выполнения программы?

Как создать новую форму и добавить на неё элементы во время выполнения программы?
Мне нужно, чтобы при нажатия кнопки (button1) открылся новое окно. И как на это новое окно...

Создать функцию с произвольным именем во время выполнения python скрипта
Предположим во время выполнения python скрипта нужно создать функцию с произвольным именем,...

1
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.01.2016, 08:30 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <functional>
 
std::function<int()> gen_clo() {
    int x = 0;
    return [x]() mutable { return ++x; };
}
 
int main() {
    std::function<int()> clo1 = gen_clo();
    std::function<int()> clo2 = gen_clo();
 
    std::cout << clo1() << std::endl;
    std::cout << clo1() << std::endl;
    std::cout << clo1() << std::endl;
 
    std::cout << clo2() << std::endl;
    std::cout << clo2() << std::endl;
}
0
07.01.2016, 08:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2016, 08:30
Помогаю со студенческими работами здесь

Возможно ли удалить функцию во время выполнения скрипта
Здравствуйте есть цикл while(){ function moya() while(){ } }

Как создать новую пулю во время выстрела
Доброго времени суток! У меня есть класс Bullet, и в основном классе объявлен как bullet. ...

Нужно на время выполнения одного макроса выключить другой (точнее функцию)
Здрасти. Проблемка, нужно на время выполнения ожного макроса выключить другой (точнее функцию)....

Как создать переменную во время выполнения программы в Delphi?
Я пишу свой простенький Интерпретатор. Пользователю нужно написать код, который затем будет...


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

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