Код: Выделить всё
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 () и перегружать его вместо этого?
Подробнее здесь: https://stackoverflow.com/questions/794 ... using-a-pe