Ich versuche, einige Template-Funktionen zu schreiben, die entweder ein std::basic_string
oder ein char-Array akzeptieren, aus dem die basic_string
konstruiert werden könnte.Vorlage Abzug Anleitung für Funktion?
Meine aktuelle Lösung ist:
#include <string>
template<typename CharT>
void foo(std::basic_string<CharT> str)
{
(void)str; // do something with str
}
template<typename CharT>
void foo(CharT const * arr)
{
return foo(std::basic_string<CharT>{arr});
}
int main(void)
{
foo("hello");
foo(std::string{ "hello" });
foo(L"hello");
foo(std::wstring{ L"hello" });
}
Das bedeutet aber, dass ich für jede Funktion eine andere Funktion zu schreiben, die die erste nennt. Das ist ziemlich nervig; Gibt es einen einfacheren Weg? Vielleicht könnte es ein Vorlagen-Deduktionsleitfaden sein, aber soweit ich weiß, existiert er nicht für Funktionen, nur für Klassen.
Die erste Template-Funktion ist nicht ausreichend, weil die Vorlagenableitung fehlschlägt: Der Compiler kann CharT
in std::basic_string<CharT>
von CharT const *
nicht ableiten. Deshalb brauche ich einen einfacheren Weg dies dem Compiler mitzuteilen.
Ersetzen Sie beide Überladungen mit einem einzigen, 'Vorlage void foo (std :: basic_string_view str)'? –
ildjarn
@ildjarn Das gleiche Problem, der Vorlagenabzug schlägt fehl. – Boiethios
@davidhigh Ich dachte darüber nach, aber wie man überprüft, ob ein Typ 'basic_string' ist? – Boiethios