锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C++开源社区 / C++17结构体绑定make_tuple示例和用途

服务方向

人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
量化预测
股票离线分析软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发

联系方式

固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品原创,禁止转载和任何形式的非法内容使用,违者必究。点名“简易百科”和“闲暇巴”盗用锐英源原创内容。


C++17结构体绑定make_tuple示例和用途


函数的多个返回值在编程中并不是一个新概念,许多其他编程语言中也存在类似的功能。C++17 附带了一项新功能(结构化绑定),该功能类似于其他语言中提供的多个返回值。

在下面的示例中,我想概述我们在旧 C++ 标准、现代标准 (C++11/14) 和现在的 C++17 中用于从函数返回多个值的一些选项:

    #include <iostream>
      #include <tuple> // std::tie    
      
  const double PI = 3.14159265;
    
        void calculateSinCos(const double param, double & resSin, double & resCos)
      { 
          resSin = sin(param * PI / 180.0); // converting degrees to radians 
          resCos = cos(param * PI / 180.0); // converting degrees to radians
     }
   
       std::pair<double, double> calculateSinCos(const double param)
     {
          return { sin(param * PI / 180.0), cos(param * PI / 180.0) };
     } 
  
       std::tuple<double, double> calculateSinCos_Tuple(const double param)
     {
          return std::make_tuple(sin(param * PI / 180.0),
                 cos(param * PI / 180.0));  // packing values into tuple
     }
        
  int main()
     {   
       double param { 90.0 };
          double resultSin { 0.0 }; 
         double resultCos { 0.0 }; 
   
           //C++98  
        calculateSinCos(param, resultSin, resultCos);
          std::cout << "C++98 : sin(" << param << ") = " <<
          resultSin << ", cos(" << param << ") = "
          << resultCos << "\n";
        
       //C++11   
       const auto resSinCos(calculateSinCos(param));
          std::cout << "C++11 : sin(" << param << ") = " <<
          resSinCos.first << ", cos(" << param << ") = "
          << resSinCos.second << "\n";
        
       //C++11   
       std::tie(resultSin, resultCos) = calculateSinCos(param);
          std::cout << "C++11 : sin(" << param << ") = " <<
          resultSin << ", cos(" << param << ") = "
          << resultCos << "\n";
   
            // C++17
          auto[a, b] =  calculateSinCos(param);
          std::cout << "C++17 :   
       sin(" << param << ") = " << a << ",
          cos(" << param << ") = " << b << "\n";
        
       // C++17
          auto[x, y] =   
          calculateSinCos_Tuple(param); // std::make_tuple(sin(val), cos(val));
          std::cout << "C++17 :
          sin(" << param << ") = " << x << ",
          cos(" << param << ") = " << y << "\n";
     }  

让我们看看上面的代码:

  1. 在这种方法中:
    calculateSinCos(param, resultSin, resultCos);

    我们使用了最古老且可能仍然是最常见的方法 - 使用作为引用传递的 OUTPUT 参数可用于将值“返回”给调用者。

  2. 考虑访问从 functions 返回的多个值的不同方法:
    const auto resSinCos(calculateSinCos(param));

    通过resSinCos.first和resSinCos.second访问std::pair结果的单个值,不是很有表现力,因为我们很容易混淆名称,而且很难阅读。

  3. 或者,在 C++17 之前,可以使用 to unpack 一个 Tuples/pair 来实现类似的效果:std::tie
    std::tie(resultSin, resultCos) = calculateSinCos(param);

    此方法演示了如何将结果对解包为两个变量。请注意,这个例子展示了 的所有功能,但尽管如此,它不如结构化绑定强大,因为我们必须首先定义我们想要绑定的所有变量。std::tiestd::tie

  4. 结构化绑定是C++17的一项新功能,使代码更具可读性、表现力和简洁性。
    auto[a, b] = calculateSinCos(param);

    请注意,变量a 和b 不是引用;它们是生成的对象成员变量的别名(或绑定)。编译器为临时对象分配唯一名称。

  5. 在 C++11 中,添加了std::tuple容器以构建包含多个返回值的元组。但是 C++11 和 C++14 都不支持直接从std::tuple元组中获取元素的简单方法 (当然,我们可以使用std::tie 解包元组,但我们仍然需要了解每个对象的类型以及这个元组有多少个对象。呼,好痛啊......

    C++17 修复了这个缺陷,结构化绑定允许我们编写如下代码

    auto[x, y] = calculateSinCos_Tuple(param);

auto其实是泛类型语言的标志,现在C++17大量使用auto,有好处,也有坏处,搞的像两个版本一样,当然如果直接学C++17,不学旧版本,就没有两个版本的问题。 不过C++17在泛型和STL上要求太高了,特别是对初学者。

如果std::tuple<double, double,double>是参数返回类型,auto[a,b]会提示“元素数量比绑定名称数量多”,auto语法错误编译器能够识别。

参数是3个,实际调用是2个,肯定有编译错误。

友情链接
版权所有 Copyright(c)2004-2024 锐英源软件
统一社会信用代码:91410105098562502G 豫ICP备08007559号 最佳分辨率 1440*900
地址:郑州市金水区文化路97号郑州大学北区院内南门附近