参考https://groups.google.com/forum/#!forum/comp.std.c/d-6Mj5Lko_s
同时参考了cppformat源代码
C++是不提倡可变参数,理由不说了。但是类似printf的函数族使用起来确实很方便,我在查找printf的替代方案时无意间看到的。感慨下,微软的CString::Format确实很好用
cppformat提供类似printf的功能,但是又是类型安全的,其核心是利用C++强大的模版功能。在实现上,cppformat实现了在编译期计算可变参数个数,原理就是https://groups.google.com/forum/#!forum/comp.std.c/d-6Mj5Lko_s里面讨论的
为简便起见,这里只以最多三个可变参数做讨论
#define ARG_N(a1,a2,a3,N,...) N这个宏的作用是,截取并返回参数列表的第四个参数
#define ARG_N_HELPER(...) ARG_N(__VA_ARGS__)辅助宏,为使结果计算正确
#define COUNT_ARG(...) ARG_N_HELPER(__VA_ARGS__,3,2,1,0)计算可变参数个数宏,可变参数个数在 大于0,小于等于3 内范围内计算正确
例如:
COUNT_ARG(x) -> 1
COUNT_ARG(x,y) -> 2
COUNT_ARG(x,y,z) -> 3

本文介绍了如何在C/C++中利用宏在编译期计算可变参数个数,以实现类似printf的安全功能。cppformat库被提及作为示例,它通过模板实现类型安全,并在编译期计算参数。讨论中提到了VC编译器可能遇到的问题及解决办法。
6987

被折叠的 条评论
为什么被折叠?



