C ++で関数をインラインで定義できますか?私はラムダ関数について話しているのではなくinline
、コンパイラーの最適化を引き起こすキーワードについて話しているのではありません。
質問する
56895 次
4 に答える
67
C ++ 11は、ラムダ関数を言語に追加しました。以前のバージョンの言語(C++98およびC++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;
});
于 2012-09-18T19:37:13.813 に答える
32
C ++ 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);
}
どちらのバージョンも、アンビエント変数を参照するように作成できます。ローカルクラスでは、参照メンバーを追加して、コンストラクターでバインドできます。クロージャーの場合、ラムダ式にキャプチャリストを追加できます。
于 2012-09-18T19:38:13.993 に答える
10
私はあなたをよく理解しているかどうかわかりませんが、ラムダ関数が必要ですか?
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';
}
c ++ 11xがない場合は、次を試してください。
于 2012-09-18T19:37:11.540 に答える
6
C ++ 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);
}
ただし、C ++ 11より前の真の関数リテラルが必要な場合、それは不可能です。
于 2012-09-18T19:39:32.633 に答える