идеально подходит для пакета параметров: конвертировать аргументы без расширения? - PullRequest
0 голосов
/ 04 января 2019

В модульных тестах я пытаюсь получить более функциональный код и упростить класс вызовов функций, таких как:

std::wstring widestr = std::wstring(o.Descr.begin(), o.Descr.end()); //o.Descr is string
wchar_t message[100];
swprintf(message, 100, L"size: %d", size);
Logger::WriteMessage(message);

в

Logger::WriteMessage(Message(L"string: %d", widestr.c_str()));

с помощью:

template<typename... T>
wchar_t* Message(T &&... args)
{
    wchar_t message[100];
    swprintf(message, 100, forward<T>(args)...);
    return message;
}

Но вывод другой:

Bad output

вместо

The output I want

1 . Я делаю правильные вещи в первую очередь? Что мне не хватает?

2 . В идеале я хотел бы написать что-то вроде (c #):

$"size:{size}".ToLogMessage();

Я думаю, что не могу в c ++ {11,14,17}. Вы подтверждаете?

Logger::WriteMessage является частью Microsoft.VisualStudio.TestTools.CppUnitTestFramework , и я не могу его изменить.

1 Ответ

0 голосов
/ 04 января 2019

Основная проблема в том, что вы не расширили пакет:

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; для широких строк вам придется делать повторные попытки с постоянно увеличивающимися буферами, пока возвращаемое значение не покажет, что предоставленный вами буфер, наконец, был достаточно большим. Тьфу.

...