Как специализировать функцию или преобразовать первый ARG функции, используя идеальный вперед?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как специализировать функцию или преобразовать первый ARG функции, используя идеальный вперед?

Сообщение Anonymous »

Я пытаюсь объединить две функции в более общую функцию: < /p>

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»