これはばかげているように思える人もいるかもしれませんが、私は管理する C スタイルの printf コードを大量に持っています。
ブーストのフォーマット ライブラリを使用してすべてを再構築することができます。ただし、当面は、1 つの引数、または 1 つ + 1 つ以上の引数を区別できるようになるだけでも大きな前進です。
https: /落とし穴)。
以下は、MFC/C++ で機能する簡単な例です。
bool Write(const wchar_t * pszText);
template <typename T> bool Write(const wchar_t * pszFormat, T, ...);
Write は vwsprintf に相当するものを呼び出す必要はありません (また呼び出すべきではありません) が、Write<> は出力文字列を作成してから Write に渡すために呼び出します。
とてもエレガントです。2 番目のインターフェイスのみを提供する (そして、1 つの文字列に偶発的な 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);
}