转载请注明出处。谢谢
新标准还修改了原有标准库,并增加了很多内容。
在学习新标准的过程中动手写了个 为std::tuple增加格式化/序列化能力的一小段代码
#define
DECLARE_TUPLE_SERIALIZATION_FUNCTION(FUNC_NAME,BEG,SEP,END) \
namespace sjdfsjfyttsaihfah6755jsdf554433356sdf{ \
template < typename Tuple,std::size_t N > \
struct tuple_printer \
{ \
static void print(std::ostream & os, const Tuple & t) \
{ \
os << std:: get < std::tuple_size < Tuple > ::value - N > (t) << SEP; \
tuple_printer < Tuple,N - 1 > ::print(os,t); \
} \
}; \
\
template < typename Tuple > \
struct tuple_printer < Tuple, 1 > \
{ \
static void print(std::ostream & os, const Tuple & t) \
{ \
os << std:: get < std::tuple_size < Tuple > ::value - 1 > (t); \
} \
}; \
} \
template < typename Tuple > \
void FUNC_NAME(std::ostream & os, const Tuple & t) \
{ \
os << BEG; \
sjdfsjfyttsaihfah6755jsdf554433356sdf::tuple_printer < Tuple,std::tuple_size < Tuple > ::value > ::print(os,t); \
os << END; \
}
实现成宏是为了使用起来更方便,可以随意指定 函数名 前缀 分隔符 和 后缀。namespace sjdfsjfyttsaihfah6755jsdf554433356sdf{ \
template < typename Tuple,std::size_t N > \
struct tuple_printer \
{ \
static void print(std::ostream & os, const Tuple & t) \
{ \
os << std:: get < std::tuple_size < Tuple > ::value - N > (t) << SEP; \
tuple_printer < Tuple,N - 1 > ::print(os,t); \
} \
}; \
\
template < typename Tuple > \
struct tuple_printer < Tuple, 1 > \
{ \
static void print(std::ostream & os, const Tuple & t) \
{ \
os << std:: get < std::tuple_size < Tuple > ::value - 1 > (t); \
} \
}; \
} \
template < typename Tuple > \
void FUNC_NAME(std::ostream & os, const Tuple & t) \
{ \
os << BEG; \
sjdfsjfyttsaihfah6755jsdf554433356sdf::tuple_printer < Tuple,std::tuple_size < Tuple > ::value > ::print(os,t); \
os << END; \
}
使用方法如下:
DECLARE_TUPLE_SERIALIZATION_FUNCTION(serialize_tuple,
"
<
"
,
"
,
"
,
"
>
"
)
int main()
{
int i = 10 ;
auto a = std::make_tuple( 3 , " lala " ,i, ' c ' );
serialize_tuple(std::cout,a);
}
int main()
{
int i = 10 ;
auto a = std::make_tuple( 3 , " lala " ,i, ' c ' );
serialize_tuple(std::cout,a);
}
输出为:
<3 , "lala" , 10 , c>
测试环境为GCC 4.5,注意编译时候请打开C++0X支持。