每一部分都单独注释的,运行时取消注释,将其他部分注释起来就可以。
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_io.hpp>
#include <boost/tuple/tuple_comparison.hpp>
#include <string>
#include <iostream>
boost::tuple<std::string, int> func()
{
return boost::make_tuple("Error message", 2009);
}
int test()
{
/*
boost::tuple 就扩展了 C++ 的数据类型 std::pair 用以储存多个而不只是两个值。
*/
//typedef boost::tuple<std::string, std::string> person;
//person p("Boris", "Schaeling");
输出会带括号,我了个大草
若想要让元组和流一起使用, 你还需要包含头文件: boost/tuple/tuple_io.hpp 才行。
//std::cout << p << std::endl;
//存储三个
//typedef boost::tuple<std::string, std::string, int> person;
//person p("Boris", "Schaeling", 43);
//std::cout << p << std::endl;
///*
//头输出不带括号,尾的输出带括号。第一个的尾是除了第一个元素剩余的部分。
//*/
//std::cout << p.get_head() << std::endl;
//std::cout << p.get_tail() << std::endl;
//std::cout << p.get_tail().get_head() << std::endl;
//std::cout << p.get_tail().get_tail() << std::endl;
/*
std::pair 有辅助函数 std::make_pair() 一样, 一个元组也可以用它的辅助函数 boost::make_tuple() 来创建。
*/
//std::cout << boost::make_tuple("Boris", "Schaeling", 43) << std::endl;
/*
一个元组也可以存储引用类型的值。
person 的第一个元素是一个指向 s 的引用。 Boost.Ref 中的 boost::ref() 就是用来创建这样的引用的。
相对的, 要创建一个常量的引用的时候, 你需要使用 boost::cref() 。
*/
/*std::string s = "Boris";
std::cout << boost::make_tuple(boost::ref(s), "Schaeling", 43) << std::endl;*/
/*
元素的访问
两种方式:如下
索引值合法性的检查会在编译期执行, 故访问非法的索引值会引起编译期错误而不是运行时的错误。
*/
/*typedef boost::tuple<std::string, std::string, int> person;
person p = boost::make_tuple("Boris", "Schaeling", 43);
std::cout << p.get<0>() << std::endl;
std::cout << boost::get<0>(p) << std::endl;*/
/*
修改元素
*/
/*typedef boost::tuple<std::string, std::string, int> person;
person p = boost::make_tuple("Boris", "Schaeling", 43);
p.get<1>() = "Becker";
std::cout << p << std::endl;*/
/*
提供了比较运算符。 为了使用它们, 你必须要包含相应的头文件: boost/tuple/tuple_comparison.hpp 。
还定义了一些其他的比较操作, 比如用来做字典序比较的大于操作等。
*/
//typedef boost::tuple<std::string, std::string, int> person;
//person p1 = boost::make_tuple("Boris", "Schaeling", 43);
//person p2 = boost::make_tuple("Boris", "Becker", 43);
输出结果是1,表示p1 p2是不同的
//std::cout << (p1 != p2) << std::endl;
/*
特殊元组Tier 。 Tier 的特殊之处在于它包含的所有元素都是引用类型的。
*/
//typedef boost::tuple<std::string&, std::string&, int&> person;
//std::string firstname = "Boris";
//std::string surname = "Schaeling";
//int shoesize = 43;
//person p = boost::tie(firstname, surname, shoesize);
在修改变量 surname 的同时, tier 也会跟着改变。
//surname = "Becker";
//std::cout << p << std::endl;
/*
当然可以用 boost::make_tuple() 和 boost::ref() 来代替构造函数 boost::tie() 。
*/
/*typedef boost::tuple<std::string&, std::string&, int&> person;
std::string firstname = "Boris";
std::string surname = "Schaeling";
int shoesize = 43;
person p = boost::make_tuple(boost::ref(firstname), boost::ref(surname), boost::ref(shoesize));
surname = "Becker";
std::cout << p << std::endl;*/
/*
也可以用作“拆箱”元组。元组中的各个元素就被很方便的“拆箱”并直接赋给了其他变量。
*/
std::string errmsg;
int errcode;
/*
通过使用 boost::tie() , 元组中的元素:字符串“Error massage”和错误代码“2009”
就很方便地经 func() 的返回值直接赋给了 errmsg 和 errcode 。
*/
boost::tie(errmsg, errcode) = func();
std::cout << errmsg << ": " << errcode << std::endl;
system("pause");
return 0;
}