【发布时间】:2013-10-08 16:50:30
【问题描述】:
C++11 或 C++14 中是否有任何新工具可以让我们停止使用:
TRACE0("one-string-no-args");
和
TRACE("formatting string with one-or-more args", arg1, arg2, etc);
这些函数必须通过名称来区分,因为据我所知,重载无法区分零附加参数情况和一个或多个参数情况。
这对于printf 样式接口当然很重要,能够知道不再有参数意味着您可以通过不尝试将格式化字符串解释为格式化字符串来避免一类错误,但仅作为最终输出字符串。
【问题讨论】:
-
void trace(string);vstemplate<class... Ts> void trace(string, Ts...)对于编译器来说是完全可以区分的。 -
是的,可变参数模板就是这样做的。如果你不知道这个名字,这里就是。 “安全”打印函数是可变参数模板的典型介绍性示例。
-
顺便说一句,我从来没有使用过它,但是如果你真的想把它提升到一个新的水平,boost 有一个很酷的named function parameter module
-
TRACE 看起来像一个宏
-
“这些函数必须通过名称来区分,因为据我所知,重载无法区分零附加参数情况和一个或多个参数情况。”据我所知,C++98 中的重载可以毫无问题地区分具有一个参数的函数和具有两个或更多参数的函数:
void foo(int); template <typename T> void foo(int, T, ...);(当然,只有在您想要第二个参数尽可能使用可变参数来改变。)
标签: c++ c++11 printf variadic-functions