Основная проблема в том, что вы не расширили пакет:
template <typename... T>
wchar_t* Message(T &&... args)
{
wchar_t message[100];
swprintf(message, 100, forward<T>(args)...);
return message;
}
Однако вы также возвращаете висячий указатель, и это большая проблема.
В конечном итоге, если Logger::WriteMessage
должен принять указатель, вам придется заключить все три строки в утилиту. Как может быть:
template <typename... T>
void WriteLogMessage(T &&... args)
{
wchar_t message[100];
swprintf(message, 100, forward<T>(args)...);
Logger::WriteMessage(message);
}
тогда просто:
WriteLogMessage(L"size: %d", size));
Теперь я попрошу вас подумать, должен ли Logger::WriteMessage
просто делать все это самому.
Как только вы это сделаете, вы можете подумать о переключении с swprintf
на что-то более C ++ - например, чтобы вам не нужно было полагаться на какой-то произвольный максимальный размер буфера. Однако использование строковых потоков и строк - не самая эффективная вещь в мире, поэтому вы также можете рассмотреть возможность выполнения swprintf
дважды: один раз с выводом nullptr
просто для получения результирующего размера строки, затем снова для фактического это в массив wchar_t
правильного размера & hellip;
& hellip; кроме, к сожалению, это возможно только с snprintf
; для широких строк вам придется делать повторные попытки с постоянно увеличивающимися буферами, пока возвращаемое значение не покажет, что предоставленный вами буфер, наконец, был достаточно большим. Тьфу.