美文网首页
C++ 11 新特性(四)

C++ 11 新特性(四)

作者: IT孤独者 | 来源:发表于2018-09-09 16:44 被阅读0次

    Lambda 表达式在一定程度上是可以和函数对象进行互转的。例子如下:

    #include <cstdio>
    
    void testLambda() {
       int i = 100;
       auto f = [i]() mutable {
          return ++i;
       };
       i = 1;
       int j = f();
       int k = f();
       
       printf("Test lambda expression: ");
       printf("i=%d, j=%d, k=%d\n", i, j, k);
       
    }
    
    void testFunctionObject() {
       
       int i = 100;
       class Add1 {
       public:
          Add1(int i) {
             this->i = i;
          }
          
          int operator()() const {
             return ++i;
          }
       
       private:
          mutable int i;
       } f(i);
       i = 1;
       int j = f();
       int k = f();
       
       printf("Test funcion object: ");
       printf("i=%d, j=%d, k=%d\n", i, j, k);
    }
    
    int main() {
       testLambda();
       testFunctionObject();
       
       return 0;
    }
    

    从代码中可以推测,Lambda 的捕获代码实际上对应函数对象的状态变量,如果 Lambda 表示的后面与 mutable 关键字,那么对应的变量也需要使用 mutable 关键字进行申明。默认的值捕获的形式所对应的函数对象的函数是有 const 的限定符,但是对于引用形式的捕获是没有这个限制的。

    下面继续分析一个问题,Lambda 的参数问题。

    新特性中 Lambda 表达式的参数类型可以使用 auto 关键字,这样就类似定义了一个模板表达式,例子如下:

    auto print_vec = [](std::vector<int> vecNumber) {
       for (auto i : vecNumber) {
          printf("%d ", i);
       }
       printf("\n");
    };
    
    const char *test_split = "**************************************";
    
    void testLambdaExpression() {
       std::vector<int> vecNUmber{0, 2, 1, 3};
       
       print_vec(vecNUmber);
       std::sort(vecNUmber.begin(), vecNUmber.end(), [](auto e1, auto e2) {
          return e1 > e2;
       });
       print_vec(vecNUmber);
       
    }
    

    这种表达式如何和函数对象进行对应呢?一个可行的例子如下:

    class anonymous_func {
    public:
       template <typename T1, typename T2>
       bool operator()(T1 e1, T2 e2) {
          return e1 > e2;
       }
    } f;
    
    void testFunctionObject() {
       std::vector<int> vecNumber{0, 2, 1, 3};
       
       print_vec(vecNumber);
       
       std::sort(vecNumber.begin(), vecNumber.end(), f);
       print_vec(vecNumber);
    }
    

    从代码中看,我们有两点不如 Lambda 表达式,第一个不能本地直接定义,就是不要通过 f 这个东西去实现,这个原因是类定义不能在表达式中完成。第二个受限是不能在函数体内定义模板相关的东西,简单说模板不能在 local class 中定义。

    相关文章

      网友评论

          本文标题:C++ 11 新特性(四)

          本文链接:https://www.haomeiwen.com/subject/qokdgftx.html