/*
* main.cpp
*
* Created on: 2015年1月2日
* Author: star
*/
#include <iostream>
#include <string>
#include <utility> // pair
#include <tuple>
#include <typeinfo>
#include <type_traits>
#include <functional> //ref
using namespace std;
template<class T,class U>
ostream& operator << (ostream& os, const pair<T,U>& t){
return os <<"["<< std::get<0>(t) <<","<< std::get<1>(t) <<"]"<<endl;
}
//tuple ,由于模板函数不支持偏特化,故以模板类封装函数来实现
template<int IDX,int MAX,typename... Args>
struct print_tuple{
static void print(std::ostream& os,tuple<Args...>& t){
if(IDX < MAX){
os << std::get<IDX>(t)<<((IDX+1) == MAX? "":",");
print_tuple<IDX+1,MAX,Args...>::print(os,t);
}else{
return;
}
}
};
template < int max,typename... args>
struct print_tuple<max,max,args...>{
static void print(ostream& os,tuple<args...>& t){
}
};
template <typename... args>
ostream& operator << (ostream& os ,tuple<args...>& t){
os << "[";
print_tuple<0,sizeof...(args),args...>::print(os,t);
return os<<"]"<<endl;
}
//pair
int main() {
pair<int, float> t = { 2, 2.5 };
pair<char, int> t1('a', 23);
auto t2 = make_pair(23, 'c');
cout << t << t1 << t2;
auto p = make_tuple(34, 4, 3, 4, 4, 4, "fdf", 345678987654323);
tuple<int, double, char> p1(43, .33, 'c');
// tuple <int,double,char> p2 ={34,.33,'e'};
tuple<int, double, char> p3 { 3454, .243, 'e' };
cout << p;
/*
*
* tuple_size<tupltype>(),适用于tuple,pair,可以求元组的个数,当然pair永远是2
* tuple_element<idx,tupletype>(),适用于tuple,pair,可以求元组的类型,第一个是序号,第二个是
*/
cout << tuple_size<decltype(p)>::value << endl;
tuple_element<0, decltype(p)>::type df;
cout << typeid(df).name();
/*
* get<num>()
* 适用于tuple,pair,num指元组中次序,当然pair只能小于2,其从0开始。最大为tuple_size()-1
* 当然对于pair,我们还有first ,second
*/
cout << get<0>(p) << get<5>(p) << endl;
cout << get<0>(t) << get<1>(t) << endl;
/*
* make_pair(),make_tuple()
* 可以传入引用,即可在外更改。
*/
int refs = 33;
char refchar = 'c';
float reff = 4.44;
auto refpair = make_pair(ref(refs), ref(refchar));
cout << refpair;
auto reftuple = make_tuple(ref(refs), ref(refchar), ref(reff));
cout << reftuple;
refs = 555;
refchar = 'e';
reff = 5.5556;
cout << refpair;
cout << reftuple;
/*
* 获取元组中的值的方式,另一种方式
* tie(ref1,ref2,...)
* 可用于pair ,tuple中的,
* tie的作用是从元组获得值存入要绑定的值。
* 如某个值不需要获取,则以std::ignore标记即可
* 其需要明确元组中数的个数。
* tie 返回一个tuple
*/
char c ='t';
auto tiepair = make_pair('e','e');
tie(std::ignore,c) = tiepair;
cout<< c<< endl;
tuple<int,float,std::string> tf(33,1.33,"more light");
int i;
float f;
string s;
std::tie(i,f,s) = tf;
cout << i <<":"<<f<<":"<<s<<endl;
/*
* tuple_cast(...)
* 可以把传入的tuple或pair类型拼成一个tuple,需要注意的若是一个元素,tie也是可以返回的。
*/
int dd = 667;
auto tt = std::tuple_cat(make_tuple(31,334,'f',"fda"),make_pair(3456,44),make_tuple(dd),tie(dd));
cout << tt;
}
* main.cpp
*
* Created on: 2015年1月2日
* Author: star
*/
#include <iostream>
#include <string>
#include <utility> // pair
#include <tuple>
#include <typeinfo>
#include <type_traits>
#include <functional> //ref
using namespace std;
template<class T,class U>
ostream& operator << (ostream& os, const pair<T,U>& t){
return os <<"["<< std::get<0>(t) <<","<< std::get<1>(t) <<"]"<<endl;
}
//tuple ,由于模板函数不支持偏特化,故以模板类封装函数来实现
template<int IDX,int MAX,typename... Args>
struct print_tuple{
static void print(std::ostream& os,tuple<Args...>& t){
if(IDX < MAX){
os << std::get<IDX>(t)<<((IDX+1) == MAX? "":",");
print_tuple<IDX+1,MAX,Args...>::print(os,t);
}else{
return;
}
}
};
template < int max,typename... args>
struct print_tuple<max,max,args...>{
static void print(ostream& os,tuple<args...>& t){
}
};
template <typename... args>
ostream& operator << (ostream& os ,tuple<args...>& t){
os << "[";
print_tuple<0,sizeof...(args),args...>::print(os,t);
return os<<"]"<<endl;
}
//pair
int main() {
pair<int, float> t = { 2, 2.5 };
pair<char, int> t1('a', 23);
auto t2 = make_pair(23, 'c');
cout << t << t1 << t2;
auto p = make_tuple(34, 4, 3, 4, 4, 4, "fdf", 345678987654323);
tuple<int, double, char> p1(43, .33, 'c');
// tuple <int,double,char> p2 ={34,.33,'e'};
tuple<int, double, char> p3 { 3454, .243, 'e' };
cout << p;
/*
*
* tuple_size<tupltype>(),适用于tuple,pair,可以求元组的个数,当然pair永远是2
* tuple_element<idx,tupletype>(),适用于tuple,pair,可以求元组的类型,第一个是序号,第二个是
*/
cout << tuple_size<decltype(p)>::value << endl;
tuple_element<0, decltype(p)>::type df;
cout << typeid(df).name();
/*
* get<num>()
* 适用于tuple,pair,num指元组中次序,当然pair只能小于2,其从0开始。最大为tuple_size()-1
* 当然对于pair,我们还有first ,second
*/
cout << get<0>(p) << get<5>(p) << endl;
cout << get<0>(t) << get<1>(t) << endl;
/*
* make_pair(),make_tuple()
* 可以传入引用,即可在外更改。
*/
int refs = 33;
char refchar = 'c';
float reff = 4.44;
auto refpair = make_pair(ref(refs), ref(refchar));
cout << refpair;
auto reftuple = make_tuple(ref(refs), ref(refchar), ref(reff));
cout << reftuple;
refs = 555;
refchar = 'e';
reff = 5.5556;
cout << refpair;
cout << reftuple;
/*
* 获取元组中的值的方式,另一种方式
* tie(ref1,ref2,...)
* 可用于pair ,tuple中的,
* tie的作用是从元组获得值存入要绑定的值。
* 如某个值不需要获取,则以std::ignore标记即可
* 其需要明确元组中数的个数。
* tie 返回一个tuple
*/
char c ='t';
auto tiepair = make_pair('e','e');
tie(std::ignore,c) = tiepair;
cout<< c<< endl;
tuple<int,float,std::string> tf(33,1.33,"more light");
int i;
float f;
string s;
std::tie(i,f,s) = tf;
cout << i <<":"<<f<<":"<<s<<endl;
/*
* tuple_cast(...)
* 可以把传入的tuple或pair类型拼成一个tuple,需要注意的若是一个元素,tie也是可以返回的。
*/
int dd = 667;
auto tt = std::tuple_cat(make_tuple(31,334,'f',"fda"),make_pair(3456,44),make_tuple(dd),tie(dd));
cout << tt;
}