tuple是TR1引入的,它扩展了pair的概念,可以拥有任意数量的元素。
tuple的构建与元素访问:
tuple<int,float,string> t1(41,6.3,"niconiconi")
auto t2 = make_tuple(22,44,"niconiconi");
get<0>(t1);
get<1>(t1);
注1:tuple的元素类型可以是引用:
string s;
tuple<string&> t(s);
get<0>(t) = "hello"; //s也被赋值为"hello"
注2:tuple不允许迭代元素。tuple必须在编译器知道元素的索引值, 如果在运行期才传入索引值
是不被允许的:
int i=0;
get<i>(t); //编译报错:i is no compile-time value
另:如果给的是无效索引,在编译期就会报错,故不用担心超出范围
注3:在tuple的各个构造函数中,接收不定个数的实参的版本被声明为explicit,这是为了避免单
个值被隐式转换为“带着一个元素的”tuple:
template<typename... Args>
void foo(const std::tuple<Args...> t);
foo(21); //error
foo(make_tuple(42));
在这种情况下,就不可以通过赋值将某个tuple初始化,因为这样会被视为一个隐式转换:
std::tuple<int, double> t3 = {42, 3.14}; //error
也不可以这样:
std::vector<std::tuple<int, float> > v{ {1, 1.1}, {2, 2.2}};
或这样:
std::tuple<int,int,int> foo()
{
return {1,2,3};
}
综上可知:对于tuple,必须明确指明该值为一个tuple(例如:可以运用make_pair)
运用引用搭配make_tuple()可以提取tuple的元素值,将某些变量值设给它们:
std::tuple<int,float,std::string> t(77,1.1, "more light");
int i;
float f;
std::string s;
auto t1 = std::make_tuple(std::ref(i), std::ref(f), std::ref(s)) = t;
这样就可以通过修改变量i、f、s的值修改t1;
也可以通过std::tie,它可以建立一个内含引用的tuple
std::tie(i,f,s) = t;
使用std::tie时,std::ignore允许忽略tuple的某些元素,也就是可以只提取tuple的一部分:
std::tie(i,std::ignore,s) =t;
tuple的其他特性:
tuple_size<tupletype>::value //获取元素个数
tuple_element<idx, tupletype>::type //获取第idx个元素的类型
tuple_cat() //可将多个tuple串联成一个tuple