Могу ли я определить функции в С++ inline? Я не говорю о лямбда-функциях, а не о ключе inline
, которое вызывает оптимизацию компилятора.
Как определить анонимные функции в С++?
Ответ 1
С++ 11 добавил лямбда-функции на язык. Предыдущие версии языка (С++ 98 и С++ 03), а также все текущие версии языка C (C89, C99 и C11) не поддерживают эту функцию. Синтаксис выглядит так:
[capture](parameters)->return-type{body}
Например, чтобы вычислить сумму всех элементов в векторе:
std::vector<int> some_list;
int total = 0;
for (int i=0;i<5;i++) some_list.push_back(i);
std::for_each(begin(some_list), end(some_list), [&total](int x) {
total += x;
});
Ответ 2
В С++ 11 вы можете использовать закрытие:
void foo()
{
auto f = [](int a, int b) -> int { return a + b; };
auto n = f(1, 2);
}
До этого вы можете использовать локальные классы:
void bar()
{
struct LocalClass
{
int operator()(int a, int b) const { return a + b; }
} f;
int n = f(1, 2);
}
Обе версии могут быть сделаны для ссылки на переменные окружения: в локальном классе вы можете добавить ссылочный элемент и связать его в конструкторе; и для закрытия вы можете добавить список захвата в выражение лямбда.
Ответ 3
Я не знаю, хорошо ли я вас понимаю, но вы хотите использовать лямбда-функцию?
http://en.cppreference.com/w/cpp/language/lambda
#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>
int main()
{
std::vector<int> c { 1,2,3,4,5,6,7 };
int x = 5;
c.erase(std::remove_if(c.begin(), c.end(), [x](int n) { return n < x; } ), c.end());
std::cout << "c: ";
for (auto i: c) {
std::cout << i << ' ';
}
std::cout << '\n';
std::function<int (int)> func = [](int i) { return i+4; };
std::cout << "func: " << func(6) << '\n';
}
Если у вас нет С++ 11x, попробуйте:
Ответ 4
Pre С++ 11, если вы хотите локализовать функцию для функции, это можно сделать:
int foo () {
struct Local {
static int bar () {
return 1;
}
};
return Local::bar();
}
или если вам нужно что-то более сложное:
int foo (int x) {
struct Local {
int & x;
Local (int & x) : x(x) {}
int bar (int y) {
return x * x + y;
}
};
return Local(x).bar(44);
}
Но если вы хотите получить истинный литерал функции в pre С++ 11, это невозможно.