Ich denke derzeit darüber nach, wie ein generischer Typ einer Vorlage zu einem std::sting
sowie String-Literale am besten beschränken. Daher vergleiche ich den abgeleiteten Typ mit dem gewünschten Typ unter Verwendung von . Im Falle eines std::string
funktioniert das sofort. Bei einem String-Literal, dh einem char const-Array, funktioniert es nur, wenn ich std::decay
für den Typ verwende und dann das Ergebnis mit dem Typ char const *
vergleiche. Wenn ich den abgeleiteten Typ direkt mit dem vergleichen würde, was er meiner Meinung nach sein sollte, gibt is_same
den Wert false zurück, wie der folgende Beispielcode zeigt.Vorlage Argument Abzug von String Literal
template <class TYPE>
void function(TYPE&& parameter)
{
//this doesn't work as expected
std::cout << typeid(TYPE).name() << " : " << typeid(char const [5]).name() << std::endl;
std::cout << std::is_same<char const [5], TYPE>::value << std::endl;
//this works as expected
std::cout << typeid(std::decay_t<TYPE>).name() << " : " << typeid(char const *).name() << std::endl;
std::cout << std::is_same<char const *, std::decay_t<TYPE>>::value << std::endl;
}
int main(int argc, char** argv)
{
function("name");
return 0;
}
Der Ausgang erzeugt wird, ist die folgende:
char const [5] : char const [5]
0
char const * __ptr64 : char const * __ptr64
1
Nun, was ich frage mich, warum ist is_same
false zurück im ersten Fall, obwohl die Typen identisch zu sein scheinen.
die einzig mögliche Erklärung, die ich mit kommen könnte, ist, dass in der Funktion std::is_same
eine Transformation ähnlich wie std::decay
auf den Typen angewandt wird (beispielsweise ein Funktionsaufruf). Aber dann würde diese Transformation auch für den anderen Typ eintreten, was das gleiche Ergebnis und damit Gleichheit ergeben würde.
Warten Sie bis C++ 17 und schreiben Sie Ihre Vorlage, um 'std :: string_view' zu verwenden. –
Versuchen Sie, Referenzen von 'TYPE' zu entfernen. String-Literale sind L-Werte. –
Danke, du hattest Recht. Das wusste ich nicht. Ändern der Zeile zu 'std :: ist_same> :: value' ergibt Gleichheit. Warum werden String-Literale als L-Werte betrachtet? Wenn es ein int literales wäre, würde es stattdessen als rvalue betrachtet, oder? Und können wir das vielleicht zur akzeptierten Antwort machen? –
user1488118