Wie spezialisiert ich die Funktion oder konvertieren die erste ARG einer Funktion mit einem perfekten Vorlauf?C++

Programme in C++. Entwicklerforum
Guest
 Wie spezialisiert ich die Funktion oder konvertieren die erste ARG einer Funktion mit einem perfekten Vorlauf?

Post by Guest »

Ich versuche, zwei Funktionen in eine allgemeinere Funktion zusammenzuführen: < /p>

Code: Select all

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>
In: < /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>
Diese Tests werden jedoch nicht kompiliert: < /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>

Schweregradcode Beschreibung Projektdatei -Unterdrückungszustandsdetails
Fehler C2664 'int SWPRINTF_S (WCHAR_T *const, const size_t, const wchar_t
*const, ...) ': Argument 3 von' const char [36] 'in' const wchar_t *const
'Utiltests kann nicht konvertiert werden C: \ Benutzer \ Soleil \ Source \ repos \ sublimetriptych \ util \ loggerbase *const, const size_t, const char *const
, ...) ': Argument 3 kann nicht konstant warch wary_t [url=viewtopic.php?t=12659]konvertieren[/url] [37] 'to' const
char *const
'Utiltests C: \ Benutzer \ Soleil \ Source \ Repos \ Sublimetriptycha \ util \ loggerbase.h 85 < /p>
< /blockquote >
Die zwei Funktionen in der Inital funktionieren gut. Geben Sie den Schalter richtig ein? dh am Ruf von Sprintf (): Etwas in der Denkweise von swprintf_s (msgbuffer, Größe, (const char*) args [0], std :: Forward  (args [1 ..]) ... ) 



Wie kann ein Weiterleitungsparameterpack spezialisiert?
tun Arbeiten Sie mit zwei Parametern, aber ich muss ein generisches Parameterpaket für Args oder Index> 1 führen. Daher handelt es sich nicht um eine Lösung. Soll ich mich bereits in den Parametern der Funktion logMessage () spezialisieren und sie stattdessen überladen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post