这对某些人来说可能看起来很愚蠢——但我有大量的 C 风格的 printf 代码需要维护。
我们可以使用 boost 的格式化库来重建它,也许我们会在这些日子里得到它。然而,与此同时,仅仅能够区分一个论点,或者一个+一个或多个论点是向前迈出的一大步。
https://stackoverflow.com/users/365496/bames53指出这是可能的,并且它似乎可以工作(在代码膨胀方面可能会付出一些代价,并且需要注意的是,这仍然是 printf 土地及其所有陷阱)。
这是一个在 MFC/C++ 中完成工作的简单示例:
bool Write(const wchar_t * pszText);
template <typename T> bool Write(const wchar_t * pszFormat, T, ...);
Write 不需要(也不应该)调用等效的 vwsprintf,而 Write<> 这样做是为了在将输出字符串传递给 Write 之前构建输出字符串。
十分优雅。消除了仅提供第二个接口的问题(如果您的一个字符串碰巧有一个意外的 printf 格式说明符,则会出现 printf 问题),或者强制客户端指定 Write() 与 WriteFormat() 或类似地执行在调用 Write() 之前本地构造字符串。
下面是用 Write 定义的 Write<>:
template <typename T> bool SimpleTextFile::Write(const wchar_t * pszFormat, T, ...)
{
va_list arglist;
va_start(arglist, pszFormat);
CStringW buffer;
buffer.FormatV(pszFormat, arglist);
va_end(arglist);
return Write(buffer);
}