变量参数列表没有命名参数?

时间:2010-04-29 16:07:17

标签: c++ variadic-functions

是否可以使用带有可变参数且没有命名参数的函数?

例如:

SomeLogClass("Log Message Here %d").Log(5);
SomeLogClass("Log Message Here %d").Error(5);

4 个答案:

答案 0 :(得分:2)

查看QString's arg方法。这些似乎是你正在寻找的东西。

你绝对可以自己动手,虽然实现可能不是很简单,特别是如果你希望它支持printf格式说明符。如果不需要printf样式,那么链接replace_all类型的呼叫听起来可行。

答案 1 :(得分:1)

你能写上面那样的代码吗 - 是的,你可以。但是如果没有至少一个非变量参数,你就无法移植写一个可变参数函数。例如,在printf()中,这是格式字符串。换句话说,您可以编写如下函数:

int printf( const char * format, ... );

但不是:

int printf( ... );

答案 2 :(得分:1)

我来自哪里,我们使用它:

Log << "LogMessageHere: " << ErrorClass << 5 << whatever << std::endl;

这不是你问题的答案,但它是你问题的解决方案,我认为它更像是c ++。

答案 3 :(得分:0)

正确的答案是否定的,你不能只定义变量参数,因为C / C ++中这样做的机制使用固定的参数来计算地址,如下所示:

void f(int a, ...) {
    va_list args;
    va_start(args, a); // without a, this macro DOESN'T WORK!!!


}

您标记的答案通过默认参数来绕过它。但这应该告诉新手的是,默认论证并不意味着论证没有通过,这意味着你不必输入它们。

void f (int a = 0, ...)

所以当你打电话给f时,你可以写:

f();

但在内部,它正在写f(0)