С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Анонимный объект по аналогии с анонимной функцией (lambda) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ UnixPosix, не ври мне! (неправильный подсчет времени вручную) http://www.cyberforum.ru/cpp-beginners/thread1062443.html
Проблема следующая - реализовал я нуля перевод из posix в человечную дату. А тут проблема появилась: ввожу 54588753952 в свою программу, а также сюда http://www.cy-pr.com/tools/time/, всё совпадает,...
C++ Сформировать файл h, заменив каждое вхождение слова «это» на слово «то» Задача: Дан текстовый файл f. Сформировать файл h, заменив каждое вхождение слова «это» на слово «то». Слова – группы символов, разделенные про-белом или признаком конца строки. Никак не разберусь... http://www.cyberforum.ru/cpp-beginners/thread1062428.html
Для заданного натурального n вычислить C++
Для заданого натурального n обчислити S = 1 + 1*2 + 1*2*3 + … + 1*2* …*n . нужно написать программу в С++
Таблица расхода материалов за сутки C++
#include <iostream> #include <conio.h> #include <string> using namespace std; int main(){ string s; struct table{ int nomer; string surname; string name;
C++ Изменить матрицу так, чтобы в строках остались элементы, которые встречаются более одного раза, а другие заменить нулями http://www.cyberforum.ru/cpp-beginners/thread1062405.html
Условие: Даны натуральные числа m, n (m, n <= 10) и целочисленную матрицу размера m x n. Изменить матрицу так, чтобы в строках остались элементы, которые встречаются более одного раза, а другие...
C++ Профессионалы программирования дайте совет Хочу стать отличным программистом. Если честно в школе до 9-го класса учился плохо в 10-11 поднажал чтобы поступить в институт,как бы знаний хватило чтобы поступить а за время учебы в школе много... подробнее

Показать сообщение отдельно
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
03.01.2014, 20:38  [ТС]
Вот то, что я, примерно, хочу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
 
int main()
{
    const int n = 10;
    std::vector<int> v(n);
    auto generator = [](){
        int i = 1;
 
        std::function<int(int)> factorial = [&factorial](const int &n){
            return n < 2 ? 1 : n * factorial(n - 1);
        };
        auto increment = [](int &i) { return i++; };
 
        return std::bind(factorial, std::bind(increment, i));
    };
    std::generate(v.begin(), v.end(), generator());
    std::cout << std::accumulate(v.begin(), v.end(), 0);
}
Добавлено через 1 минуту
Код естественно не рабочий. Но идею отображает полностью.

P.S. он компилируется (:

Добавлено через 4 минуты
Я так понимаю что
Цитата Сообщение от outoftime Посмотреть сообщение
int i = 1;
удаляется после вызова generator и при вызове factorial идет обращение к недоступной области памяти, и обойти это можно используя динамическое управление памятью.

Добавлено через 1 минуту
gray_fox, Dmitriy_M, как я писал выше я не хочу явно объявлять класс.

Добавлено через 12 минут
Сейчас задался вопросом о том можно ли вообще обращаться с функциями, в том числе lambda как с объектами, в плане выделения памяти под их внутреннее состояние.

По ходу эту проблему решают структуры, только для себя я так и не нашел красивого решения.

Добавлено через 5 минут
Остановился на варианте со структурой, т.к. она максимально проста, позволяет сохранять внутреннее состояние, может быть использована в качестве функтора и она не засоряет общее пространство имен.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
#include <algorithm>
 
int main()
{
    const int n = 10;
    std::vector<int> v(n);
    typedef struct {
        int i = 1;
        int factorial(const int &n) {
            return n < 2 ? 1 : n * this->factorial(n - 1);
        }
        int operator()() {
            return this->factorial(this->i++);
        }
    } generator;
    std::generate(v.begin(), v.end(), generator());
    std::cout << std::accumulate(v.begin(), v.end(), 0);
}
Добавлено через 24 минуты
Как подсказал мне мой друг, можно еще использовать статическую переменную, тогда код можно переписать где-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <vector>
#include <algorithm>
 
int main()
{
    const int n = 10;
    std::vector<int> v(n);
    std::generate(v.begin(), v.end(),
                  [](){
                        static int i = 1;
 
                        const std::function<int(const int&)> factorial = 
                            [&factorial](const int &n) {
                                return n < 2 ? 1 : n * factorial(n - 1);
                            };
 
                        return factorial(i++);
                  });
    std::cout << std::accumulate(v.begin(), v.end(), 0);
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.