在变长参数函数中,'...' 必须放在最后。并且默认值启用参数也必须在最后。
那么,在同一个功能中需要两者怎么样?
现在我有一个日志实用程序:void MyPrint(int32_t logLevel, const char *format, ...),它用于根据'logLevel'打印日志。
但是,有时我希望它可以用作:MyPrint("Log test number%d", number),而不需要'logLevel'。
问题: 默认参数和可变参数函数 没有帮助。
在变长参数函数中,'...' 必须放在最后。并且默认值启用参数也必须在最后。
那么,在同一个功能中需要两者怎么样?
现在我有一个日志实用程序:void MyPrint(int32_t logLevel, const char *format, ...),它用于根据'logLevel'打印日志。
但是,有时我希望它可以用作:MyPrint("Log test number%d", number),而不需要'logLevel'。
问题: 默认参数和可变参数函数 没有帮助。
在您的特定情况下,您可能只想制作两个版本的 MyPrint,例如:
MyPrint(const char *format, ...)
{
_logLevel = 1;
// stuff
}
MyPrint(int32_t logLevel, const char *format, ...)
{
_logLevel = logLevel;
//stuff
}
另一方面,命名参数习语确实会提供另一种解决方案:
class Abc
{
public:
MyPrint(const char *format, ...)
{
_logLevel = 1;
// stuff
}
Abc &setLogLevel(int32_t logLevel)
{
_logLevel = logLevel;
}
// stuff
};
所以你可以这样调用 MyPrint() :
MyPrint("blah,blah", 123);
或像这样:
MyPrint("blah,blah", 123).setLogLevel(5);