60

私はネット上の閉鎖について読んでいました。C++ にクロージャ用の組み込み機能があるかどうか、または C++ でクロージャを実装できる方法があるかどうか疑問に思っていました。

4

6 に答える 6

41

最新の C++ 標準であるC++11にはクロージャがあります。

http://en.wikipedia.org/wiki/C%2B%2B11#Lambda_functions_and_expressions

http://www.cprogramming.com/c++11/c++11-lambda-closures.html

于 2012-09-28T07:08:24.700 に答える
19

はい、これは、ファンクターを使用せずに状態を持つ関数を実装する方法を示しています。

#include <iostream>
#include <functional>


std::function<int()> make_my_closure(int x){
    return [x]() mutable {   
        ++x;
        return x;   
    };
}

int main()
{
    auto my_f = make_my_closure(10);

    std::cout << my_f() << std::endl; // 11
    std::cout << my_f() << std::endl; // 12
    std::cout << my_f() << std::endl; // 13

     auto my_f1 = make_my_closure(1);

    std::cout << my_f1() << std::endl; // 2
    std::cout << my_f1() << std::endl; // 3
    std::cout << my_f1() << std::endl; // 4

    std::cout << my_f() << std::endl; // 14
}

未定義の動作を導入する mutable キーワードを忘れていました (clang バージョンはガベージ値を返していました)。実装されているように、クロージャーは正常に機能します(GCCおよびclangで)

于 2015-11-11T14:39:29.877 に答える
9

閉鎖の意味に依存すると思います。私が常に使用してきた意味は、ある種のガベージ コレクションを意味します (ただし、参照カウントを使用して実装できると思います)。他の言語のラムダは参照をキャプチャして参照先のオブジェクトを存続させますが、C++ のラムダは値をキャプチャするか、参照先のオブジェクトを存続 させません(参照は簡単にぶら下がります)。

于 2012-09-28T07:29:54.833 に答える
7

はい、C++11にはラムダという名前のクロージャがあります。

C ++ 03にはラムダの組み込みサポートはありませんが、Boost.Lambda実装があります。

于 2012-09-28T07:10:29.407 に答える