一次小小的模板尝试
2013-04-22 09:54
155 查看
近日,项目中追加了一个需求,打印log。
要求:在函数的异常退出处打印一些有用的参数。如函数的传入参数,异常返回值等等。一次最多可以打印5个参数。当参数多余两个的时候打印两行
如图,输出参数最多可以有五个,当大于2个时输出两行,当参数小于和等于2个时,输出一行。
遇到的问题:
1,输出log时需要确定要输出的参数个数。
2,参数的类型有多种。
项目中已经有人写了一份log函数,但是实现的有点生硬,大致代码如下:
这样实现,每次要输出log时必须先调用StartLog,然后输入各个参数,最后在调用EndLog来把log输出出去。每次至少要三部才能完成输出log的作用。
分析一下:为什么StartLog和EndLog需要成对使用呢,因为不能事先知道有多少个参数要输出,那我可不可以通过参数个数来减去这两步的繁琐呢。我认为可以。
接写来遇到的另一个问题,每次输入的参数类型不一样,U1,U2,U4,I1等等。这也好说,用template嘛,它不就是做这些事情的么。
于是乎着手改写log输出的实现,改写后如下。
class temlog {
private:
temlog(){}
temlog(temlog & rhs);
U1 au1Buffer[32];
public:
~temlog(){}
VD InitBuffer(U1 ModelID, U1 FunctionID, U1 FlagID)
{}
template <class Param1>
VD SetParams(Param1)
{}
template <class Param1, class Param2>
VD SetParams(Param1, Param2)
{}
template <class Param1, class Param2, class Param3>
VD SetParams(Param1, Param2, Param3)
{}
template <class Param1, class Param2, class Param3, class Param4>
VD SetParams(Param1, Param2, Param3, Param4)
{}
template <class Param1, class Param2, class Param3, class Param4, class Param5>
VD SetParams(Param1, Param2, Param3, Param4, Param5)
{}
};
完!
要求:在函数的异常退出处打印一些有用的参数。如函数的传入参数,异常返回值等等。一次最多可以打印5个参数。当参数多余两个的时候打印两行
如图,输出参数最多可以有五个,当大于2个时输出两行,当参数小于和等于2个时,输出一行。
遇到的问题:
1,输出log时需要确定要输出的参数个数。
2,参数的类型有多种。
项目中已经有人写了一份log函数,但是实现的有点生硬,大致代码如下:
#include <iostream> #include <cstring> typedef unsigned char U1; typedef unsigned short U2; typedef unsigned long U4; typedef char I1; typedef short I2; typedef long I4; typedef void VD; class log { private: log(){ memset(au1Buffer, 0, sizeof au1Buffer); } U1 au1Buffer[32]; public: ~log(){} VD InitLogBuffer(U1 u1ModelID) { au1Buffer[3] = u1ModelID; } VD StartLog(U1 u1FunctionID, U1 u1FlagID) { au1Buffer[4] = u1FunctionID; au1Buffer[5] = u1FlagID; } VD SetFirstParam(VD* ptr, U4 BufferSize) { // code } VD SetSecondParam(VD* ptr, U4 BufferSize) { // code } VD SetThreeParam(VD* ptr, U4 BufferSize) { // code } VD SetFourParam(VD* ptr, U4 BufferSize) { // code } VD SetFiveParam(VD* ptr, U4 BufferSize) { // code } void EndLog() { //print log } };
这样实现,每次要输出log时必须先调用StartLog,然后输入各个参数,最后在调用EndLog来把log输出出去。每次至少要三部才能完成输出log的作用。
分析一下:为什么StartLog和EndLog需要成对使用呢,因为不能事先知道有多少个参数要输出,那我可不可以通过参数个数来减去这两步的繁琐呢。我认为可以。
接写来遇到的另一个问题,每次输入的参数类型不一样,U1,U2,U4,I1等等。这也好说,用template嘛,它不就是做这些事情的么。
于是乎着手改写log输出的实现,改写后如下。
class temlog {
private:
temlog(){}
temlog(temlog & rhs);
U1 au1Buffer[32];
public:
~temlog(){}
VD InitBuffer(U1 ModelID, U1 FunctionID, U1 FlagID)
{}
template <class Param1>
VD SetParams(Param1)
{}
template <class Param1, class Param2>
VD SetParams(Param1, Param2)
{}
template <class Param1, class Param2, class Param3>
VD SetParams(Param1, Param2, Param3)
{}
template <class Param1, class Param2, class Param3, class Param4>
VD SetParams(Param1, Param2, Param3, Param4)
{}
template <class Param1, class Param2, class Param3, class Param4, class Param5>
VD SetParams(Param1, Param2, Param3, Param4, Param5)
{}
};
完!
相关文章推荐
- 一次小小的 Excel 的 VBA 尝试
- 一次多进程的小尝试
- 模式的一次简单尝试
- 疑惑即新知——记一次reverse模板实现过程
- 终于尝试了一次wallop
- Win7下尝试编译Fast RCNN---- 一次失败的经历
- 使用 wordcloud, jieba, PIL, matplotlib, numpy 进行分词,统计词频,并绘制词云的一次尝试
- 初学习python,小小尝试
- VS2012新建MVC3/MVC4项目时,报:此模板尝试加载组件程序集“NuGet.VisualStudio.Interop...”
- Python解析器源码加密系列之(二):一次使用标准c的FILE*访问内存块的尝试
- 一次失败的jQuery优化尝试小结
- 一次用爬虫扒取豆瓣电影条目信息的尝试
- 仿造LWUIT textField的一次尝试
- 一次在局域网中ssh连接的尝试
- 【C++模版之旅】项目中一次活用C++模板(traits)的经历。-新注解
- 记一次xss攻击尝试(厦门工学院网站)附代码
- 【C++模版之旅】项目中一次活用C++模板(traits)的经历
- 针对RapTier模板的一点扩充[将Dt导入成自定义的Model,只需要把外部生成的DataTable进行一次映射即可.附源码]
- 极路由的一次尝试
- 终于尝试了一次EF