VS 2010 c++11のサポート状況検証

4798 ワード

現在は、テスト作業で使用されているものが多いだけです.

インテリジェントポインタ

  • shared_ptr
  • #include 
    std::shared_ptra(new A);

    ----サポート!make_もサポートshared
  • weak_ptr---サポート、結局これはshared_ptrアシストポインタテンプレート
  • unique_prt----支持!make_はサポートされていませんunique、これも普通です.結局、これはC++14の文法です.

  • 総合的に見ると、VS 2010に独自のスマートポインタを使うことができます.

    autoタイプ自己導出

    vector v_ints;
    v_ints.push_back(1);
    v_ints.push_back(2);
    auto it = v_ints.cbegin();
    
    std::cout << *it <<:endl auto="" a="make_shared<A">();
    
    auto b = a;
    

    ------サポート!

    Lambda式


    Constructs a closure: an unnamed function object capable of capturing variables in scope.
    c++11には、次の3つの構文があります.
    [ captures ] ( params ) -> ret_type { body } (1) [ captures ] ( params ) { body } (2) [ captures ] { body } (3)
    理論的には最初の文法の簡略化版であり、必要に応じて使用されます.
    閉パッケージはコンテキスト付きの関数です.はっきり言って、状態の関数があります
    関数はコードであり,状態は変数のセットであり,コードと変数のセットをバンドル(bind)すると閉パケットを形成する.
    C++で閉パッケージを実現する3つの方式
  • リロードoperator()
  • 閉パケットは関数+状態であるため、この状態は隠されたthisポインタによって伝達される.したがって、閉パケットは必ず関数オブジェクトである.メンバー変数は状態を保存するのに非常に良いツールであるため、operator()演算子の再ロードを実現し、このクラスのオブジェクトを閉パッケージとして使用することができる.デフォルトで入力thisポインタは、メンバー変数にアクセスする方法を提供します.(実際、lambdaとbindの原理はすべてこれです.)
    class MyFunctor
    {
    public:
        MyFunctor(float f) : round(f) {}
        int operator()(float f) { return f + round; }
    private:
        float round;
    };
    float round = 0.5;
    MyFunctor f(round);
  • lambda式
  • float round = 0.5;
    auto f = [=](float f) { return f + round; }

    C++11の中のlambdaは閉パッケージの実現である.
  • boost::bind/std::bind
  • int boost_func(float f, float round)
    { return f + round; }
    float round = 0.5;
    boost::function f = boost::bind(boost_func, _1, round);

    closureのステータスは、特に実行されるコンテキストを指します.closureは、実行時に必要なコンテキストを格納し、closureの作成時のコンテキストがclosureの実行時に依然として有効であることを保証します.
    例えばroundはclosureのコンテキストです.コンテキストを保存するこの特徴は、通常、「capture」または「bind」と呼ばれる.Captureは自分で書くことができます.例えばMyFuctorf(round);boost::bindも使えます.
    vs 2010テスト:
    int make_i = 3;
    
    auto f = [=](int x){
        std::cout << x << make_i << '
    '; };// ; f(make_i);

    ------サポート!
    匿名表現をサポートすることは、閉パッケージのサポートを意味し、C++では、閉パッケージはそれほど有名ではありません.結局、この概念はフロントエンドJSが作ったものです.しかしlambda式ははっきりしていて、コードを簡素化することができて、後で学習記録を補充する計画があります.まずここを参考にしてもいいです.

    for_each


    Possible implementation
    template
    UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
    {
        for (; first != last; ++first) {
            f(*first);
        }
        return f;
    }

    すべての要素をループし、f関数を使用してすべての要素(反復器)を処理します.
    テストfor_eachのlambda式
    #include 
    for_each(v_ints.begin(),v_ints.end(),[](int val){
        cout << val << endl;
    });

    ------サポート!

    Range-based for loop

    vector v_ints;
    v_ints.push_back(1);
    v_ints.push_back(2);
    
    for (const int& i : v_ints) // access by const reference
        std::cout << i << ' ';
    std::cout << '
    ';

    コンパイルエラー.
    ----サポートしていません!

    正規表現


    テスト:
    std::string fnamesstring[] = {"foo.txt", "bar.txt", "baz.dat", "zoidberg"};
    vector fnames(fnamesstring,fnamesstring+4);
    std::regex txt_regex("[a-z]+\\.txt");
    
    for_each(fnames.begin(),fnames.end(),[&](const string &fname){
        std::cout << fname << ": " << std::regex_match(fname, txt_regex) << '
    '; } );

    ------サポート!

    bind関数テンプレート


    The function template bind generates a forwarding call wrapper for f. Calling this wrapper is equivalent to invoking f with some of its arguments bound to args.
    ----関数テンプレートはfにバインドされて転送呼び出しパッケージを生成する.このパッケージを呼び出すのは、fを呼び出し、argsにいくつかのパラメータをバインドすることに等しい.(機械翻訳は感動的)
    個人的にはbind関数テンプレートは、ネストされたバインドサブエクスプレッション関数、バインドクラスメンバー関数、さらにはクラスのメンバー変数など、いくつかの関数をより広い範囲で使用することができます.
    検証コード:
    #include 
    void f(int n1 ,int n2,int n3 ,int n4 ,int n5){
        cout << n1 <

    ------サポート!

    その他

    vector v_ints = {1,2,3,4,5,6,2,4,3}; vs 2010ではこのような初期化はサポートされていません
    実行可能な変更:
    int ints[] = {1,2,3,4,5,6,2,4,3};
    vector v_ints(ints,ints+9);

    転載先:https://www.cnblogs.com/Stultz-Lee/p/10036207.html