template
auto LoggerBase::LogMessage(T&&... args) -> void
{
if (Verbose)
{
constexpr int size{ 256 };
char msgBuffer[size];
auto size_copied = sprintf_s(msgBuffer, size, std::forward(args)...);
std::string msg(msgBuffer);
LogMessageQuery.Add(msg);
}
}
template
auto LoggerBase::LogMessageW(T&&... args) -> void
{
if (Verbose)
{
constexpr int size{ 256 };
wchar_t msgBuffer[size];
auto size_copied = swprintf_s(msgBuffer, size, std::forward(args)...);
std::wstring wmsg(msgBuffer);
LogMessageQuery.Add(wmsg);
}
}
< /code>
Into: < /p>
template
auto LoggerBase::LogMessageAny(T&&... args) -> void
{
if (Verbose)
{
using firstType = typename std::tuple_element::type;
constexpr int size{ 256 };
if (typeid(firstType) == typeid(const wchar_t*))
{
wchar_t msgBuffer[size];
auto size_copied = swprintf_s(msgBuffer, size, std::forward(args)...);
std::wstring wmsg(msgBuffer);
LogMessageQuery.Add(wmsg);
}
else if (typeid(firstType) == typeid(const char*))
{
char msgBuffer[size];
auto size_copied = sprintf_s(msgBuffer, size, std::forward(args)...);
std::string msg(msgBuffer);
LogMessageQuery.Add(msg);
}
}
}
< /code>
Однако эти тесты не компилируются: < /p>
typedef void(__stdcall* MessageChangedCallback)(const wchar_t* string);
static MessageChangedCallback log = [](const wchar_t* z)
{
Logger::WriteMessage(z);
};
TEST_CLASS(LoggerBaseTests)
{
public:
TEST_METHOD(LogMessageAny_stringTest)
{
LoggerBase sut(log);
sut.LogMessageAny("This is a good std::string TEST %i!", 123);
}
TEST_METHOD(LogMessageAny_wstringTest)
{
LoggerBase sut(log);
sut.LogMessageAny(L"This is a good std::wstring TEST %i!", 456);
}
};
< /code>
Код стропительной код Описание Описание Файл Файл Стоимость подавления линии *const, ...) ': не может преобразовать аргумент 3 из' const char [36] 'в' const wchar_t *const
'utiltests C: \ users \ soleil \ source \ repos \ sooblimetriptych \ util \ loggerbase.h 78 < /p>
Код серьезности Описание. *const, const size_t, const char *const
, ...) ': не может конвертировать аргумент 3 из' const wchar_t [37] 'в' const
char *const
'utiltests c: \ users \ soleil \ source \ repos \ sooblimetriptych \ util \ loggerbase.h 85 < /p>
< /blockquote>
inital две функции работают хорошо. /> < /li>
[*] Как я могу специализироваться в первом arg и перенести остальные? т.е., на вызове Sprintf (): что -то в мышлении swprintf_s (msgbuffer, size, (const char*) args [0], std :: forward (args [1 ..]) ... )
Как специализировать пакет параметров пересылки?
делать Работайте с двумя параметрами, но мне нужно сохранить общий пакет параметров для аргументов индекса> 1, поэтому это не решение. < /p>
Должен ли я уже специализироваться на параметрах функции logmessage () и перегружать его вместо этого?
Я пытаюсь объединить две функции в более общую функцию: < /p> [code]template auto LoggerBase::LogMessage(T&&... args) -> void { if (Verbose) { constexpr int size{ 256 }; char msgBuffer[size]; auto size_copied = sprintf_s(msgBuffer, size, std::forward(args)...); std::string msg(msgBuffer); LogMessageQuery.Add(msg); } }
template auto LoggerBase::LogMessageW(T&&... args) -> void { if (Verbose) { constexpr int size{ 256 }; wchar_t msgBuffer[size]; auto size_copied = swprintf_s(msgBuffer, size, std::forward(args)...); std::wstring wmsg(msgBuffer); LogMessageQuery.Add(wmsg); } } < /code> Into: < /p> template auto LoggerBase::LogMessageAny(T&&... args) -> void { if (Verbose) { using firstType = typename std::tuple_element::type; constexpr int size{ 256 }; if (typeid(firstType) == typeid(const wchar_t*)) { wchar_t msgBuffer[size]; auto size_copied = swprintf_s(msgBuffer, size, std::forward(args)...); std::wstring wmsg(msgBuffer); LogMessageQuery.Add(wmsg); } else if (typeid(firstType) == typeid(const char*)) { char msgBuffer[size]; auto size_copied = sprintf_s(msgBuffer, size, std::forward(args)...); std::string msg(msgBuffer); LogMessageQuery.Add(msg); } } } < /code> Однако эти тесты не компилируются: < /p> typedef void(__stdcall* MessageChangedCallback)(const wchar_t* string); static MessageChangedCallback log = [](const wchar_t* z) { Logger::WriteMessage(z); };
TEST_CLASS(LoggerBaseTests) { public: TEST_METHOD(LogMessageAny_stringTest) { LoggerBase sut(log); sut.LogMessageAny("This is a good std::string TEST %i!", 123); }
TEST_METHOD(LogMessageAny_wstringTest) { LoggerBase sut(log); sut.LogMessageAny(L"This is a good std::wstring TEST %i!", 456); }
}; < /code>
Код стропительной код Описание Описание Файл Файл Стоимость подавления линии *const, ...) ': не может преобразовать аргумент 3 из' const char [36] 'в' const wchar_t *const 'utiltests C: \ users \ soleil \ source \ repos \ sooblimetriptych \ util \ loggerbase.h 78 < /p> Код серьезности Описание. *const, const size_t, const char *const , ...) ': не может конвертировать аргумент 3 из' const wchar_t [37] 'в' const char *const 'utiltests c: \ users \ soleil \ source \ repos \ sooblimetriptych \ util \ loggerbase.h 85 < /p> < /blockquote> inital две функции работают хорошо. /> < /li> [*] Как я могу специализироваться в первом arg и перенести остальные? т.е., на вызове Sprintf (): что -то в мышлении swprintf_s (msgbuffer, size, (const char*) args [0], std :: forward (args [1 ..]) ... ) [/code]
Как специализировать пакет параметров пересылки? делать Работайте с двумя параметрами, но мне нужно сохранить общий пакет параметров для аргументов индекса> 1, поэтому это не решение. < /p> [list] [*] Должен ли я уже специализироваться на параметрах функции logmessage () и перегружать его вместо этого? [/list]