zoukankan      html  css  js  c++  java
  • boost::tuple 深入学习解说

    #include<iostream>
    #include<string>
    #include<boost/tuple/tuple.hpp>
    #include<boost/tuple/tuple_io.hpp>
    #include <boost/tuple/tuple_comparison.hpp>

    using namespace std;

    int main(){
        //boost::tuple 扩展了 C++ 的数据类型 std::pair 用以储存多个而不仅仅是两个值。



        //除了 boost::tuple。 这一章还涵盖了类 boost::any 和 boost::variant 以储存那些不确定类型的值。

    当中 boost::any 类型的变量使用起来就像弱类型语言中的变量一样灵活。 还有一方面, boost::variant 类型的变量能够储存一些提前定义的数据类型, 就像我们用 union 时候一样。
        typedef boost::tuple<std::string, std::string> person1;
        person1 p1("Boris", "Schaeling");
        cout << p1 << std::endl;
        //就像 std::pair 有辅助函数 std::make_pair() 一样, 一个元组也能够用它的辅助函数 boost::make_tuple() 来创建。
        std::cout << boost::make_tuple("Boris", "Schaeling", 43) << std::endl;

         //一个元组也能够存储引用类型的值。
         std::string s = "Boris";
         std::cout << boost::make_tuple(boost::ref(s), "Schaeling", 43) << std::endl;

         //由于 "Schaeling" 和 43 是按值传递的,所以就直接存储在了元组中。 与他们不同的是: person 的第一个元素是一个指向 s 的引用。 Boost.Ref 中的 boost::ref() 就是用来创建这种引用的。

    相对的。 要创建一个常量的引用的时候, 你须要使用 boost::cref() 。

         //在学习了创建元组的方法之后, 让我们来了解一下訪问元组中元素的方式。

    std::pair 仅仅包括两个元素。 故能够使用属性 first 和 second 来訪问当中的元素。

    但元组能够包括无限多个元素, 显然。 我们须要用还有一种方式来解决訪问的问题。

         typedef boost::tuple<std::string, std::string, int> person2;
         person2 p2 = boost::make_tuple("Boris", "Schaeling", 43);
         std::cout << p2.get<0>() << std::endl;
         std::cout << boost::get<0>(p2) << std::endl;

         //我们能够用两种方式来訪问元组中的元素: 使用成员函数 get() , 或者将元组传给一个独立的函数 boost::get() 。 使用这两种方式时, 元素的索引值都是通过模板參数来指定的。

    样例中就分别使用了这两种方式来訪问 p 中的第一个元素。

    因此, Boris 会被输出两次。

         //另外。 对于索引值合法性的检查会在编译期执行, 故訪问非法的索引值会引起编译期错误而不是执行时的错误。

         //对于元组中元素的改动。 你相同能够使用 get() 和 boost::get() 函数。


         typedef boost::tuple<std::string, std::string, int> person3;
         person3 p3 = boost::make_tuple("Boris", "Schaeling", 43);
         p3.get<1>() = "Becker";
         std::cout << p3 << std::endl;

         //get() 和 boost::get() 都会返回一个引用值。 样例中改动了 lastname 之后将会输出: (Boris Becker 43) 。



         //Boost.Tuple 除了重载了流操作运算符以外, 还为我们提供了比較运算符。 为了使用它们, 你必需要包括对应的头文件: boost/tuple/tuple_comparison.hpp 。

         typedef boost::tuple<std::string, std::string, int> person4;
         person4 p4 = boost::make_tuple("Boris", "Schaeling", 43);
         person4 p5 = boost::make_tuple("Boris", "Becker", 43);
         std::cout << (p4 != p5) << std::endl;

         //上面的样例将会输出 1 由于两个元组 p1 和 p2 是不同的。


    }

    编译后输出:

    (Boris Schaeling)
    (Boris Schaeling 43)
    (Boris Schaeling 43)
    Boris
    Boris
    (Boris Becker 43)
    1


  • 相关阅读:
    VGG卷积神经网络模型解析
    利用Azure内容审查器审查违规内容(上)
    Kotlin + 协程 + Retrofit + MVVM优雅的实现网络请求
    OpenCV 实现图片的水平投影与垂直投影,并进行行分割
    C#自定义ip控件
    C#、Java中的一些小知识点总结(持续更新......)
    WinForm程序,实现只启动一个实例
    将DLL文件直接封装进exe执行文件中(C#)
    WinForm下的loading框的实现
    获取串口映射的COM端口号
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7235278.html
Copyright © 2011-2022 走看看