Вот то, что я, примерно, хочу:
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);
} |
|