一、关键点
1、实现一个不定形参的函数。
2、va_start函数解析不定形参。
3、使用vsnprintf函数将不定形参写入字符串。
二、代码示例(C++14)
/** @brief Returns a text string formatted using the printf-like expression.
The function acts like sprintf but forms and returns an STL string. It can be used to form an error
message in the Exception constructor.
@param format[in] printf-compatible formatting specifiers.
**Note**:
|Type|Specifier|
|-|-|
|`const char*`|`%s`|
|`char`|`%c`|
|`float` / `double`|`%f`,`%g`|
|`int`, `long`, `long long`|`%d`, `%ld`, ``%lld`|
|`unsigned`, `unsigned long`, `unsigned long long`|`%u`, `%lu`, `%llu`|
|`uint64` -> `uintmax_t`, `int64` -> `intmax_t`|`%ju`, `%jd`|
|`size_t`|`%zu`|
*/
std::string Format(const char *format, ...)
{
int bufferSize = 1024;
for (;;) {
va_list ap;
va_start(ap, format); // 解析不定形参
std::unique_ptr<char[]> buffer = std::make_unique<char[]>(bufferSize); // 字符串buffer
int len = vsnprintf(buffer.get(), bufferSize, format, ap); // 不定形参写入字符串
va_end(ap);
assert(len >= 0);
if (len >= bufferSize) {
bufferSize = len + 1;
continue;
}
return std::string(buffer.get());
}
}