Warum ist dieser automatische Typabzug nur für Funktionen und nicht für Klassen möglich?Vorlage Typ Abzug in C++ für Klasse vs Funktion?
Antwort
In bestimmten Fällen können Sie immer wie std::make_pair
tun:
template<class T>
make_foo(T val) {
return foo<T>(val);
}
EDIT: Ich habe gerade folgend in "The C++ Programming Language, Third Edition", Seite 335. Bjarne sagen:
Beachten Sie, dass Klassenschablonenargumente nie abgeleitet werden. Der Grund ist, dass die Flexibilität von mehreren Konstruktoren für eine Klasse solche Abzug unmöglich in vielen Fällen und obskuren in vielen mehr.
Dies ist natürlich sehr subjektiv. Es gibt einige Diskussionen darüber in comp.std.c++
und der Konsens scheint zu sein, dass es keinen Grund gibt, warum es konnte nicht unterstützt werden. Ob es eine gute Idee wäre oder nicht, ist eine andere Frage ...
Ich denke, dass implizite Typumwandlung nur auf Funktionsargumente nur anwendbar ist, damit der Compiler es ableiten kann, um den Funktionsaufruf erfolgreich zu machen.
Aber wie kann es ableiten, welchen Typ Sie es Klasse haben möchten.
Wir müssen 4 so einen Tag warten, wenn wir AI basierten Compiler haben, um unsere Gedanken zu lesen.
-1 Soweit ich weiß, sind psychische Kräfte nicht Teil eines AI-Forschungsprogramms. Während ich erkenne, dass Englisch nicht jedermanns Muttersprache ist, ist der Missbrauch von "4" unverzeihlich. –
+1 sagte warten bis zu den Tagen, wenn Compiler "wissen können, was Sie versuchen zu tun" und sehr zuverlässig sein ... es ist eine Möglichkeit. Fügen Sie dem Makefile einfach eine Markierung hinzu. –
Keine KI erforderlich - GCC7 beansprucht Unterstützung für den Templatargumentabzug für Klassenvorlagen: https://gcc.gnu.org/projects/cxx-status.html http://www.open-std.org/jtc1/sc22/wg21 /docs/papers/2016/p0091r3.html Also halt einfach ein bisschen länger. ;) – Xupicor
Im Falle eines Funktionsaufrufs leitet der Compiler den Vorlagentyp vom Argumenttyp ab. Zum Beispiel die std::max-Funktion. Der Compiler verwendet den Typ der Argumente, um den Vorlagenparameter abzuleiten. Dies funktioniert nicht immer, da nicht alle Anrufe eindeutig sind.
int a = 5;
float b = 10;
double result1 = std::min(a, b); // error: template parameter ambigous
double result2 = std::min<double>(a, b); // explicit parameter enforces use of conversion
Bei einer Vorlagenklasse ist das nicht immer möglich. Nehmen wir zum Beispiel diese Klasse:
template< class T>
class Foo {
public:
Foo();
void Bar(int a);
private:
T m_Member;
};
Der Typ T nie in einem Funktionsaufruf angezeigt wird, so dass der Compiler überhaupt keinen Hinweis hat, welche Art verwendet werden soll.
So ist es nicht immer möglich, aber, wie Sie betonen, auch nicht für Funktionen. Das erklärt nicht wirklich warum es nicht unterstützt wird. –
Ich weiß nicht, warum es nicht unterstützt wird (eine Best-Effort-Lösung wäre denkbar), aber die Frage war, ob es möglich ist. Ich denke, ich habe das beantwortet, deshalb verstehe ich den Downvote nicht. –
Ich denke, er fragte * warum * es ist nicht möglich, nicht * ob * es möglich ist. –
Bei Kona meeting Template-Parameter Abzug für Konstrukteure (P0091R0) genehmigt wurde, was bedeutet, dass in C++ 17 wir in der Lage sein zu schreiben:
pair p1{"foo"s, 12};
auto p2 = pair{"foo"s, 12};
f(pair{"foo"s, 12});
- 1. C++ rekursive Vorlage Typ Abzug
- 2. Partial Vorlage Typ Abzug
- 3. Abzug einer Klasse von der Template-Klasse in Vorlage C++
- 4. Geben nullptr einen Typ für Vorlage Abzug
- 5. C++ 11-Typ Abzug vs const char *
- 6. Vorlage Argument Abzug für 'char *'
- 7. Vorlage Argument Typ Abzug von Konvertierungsoperator
- 8. in rekursive Funktion Typ Abzug Return
- 9. std :: initializer_list typ abzug
- 10. Vorlage Abzug scheint falsch
- 11. Debugging-Vorlage Abzug Versagen
- 12. C++ Verwendung Funktionsargument Typ für Template-Argument Abzug
- 13. Vorlage Argument Abzug fehlgeschlagen
- 14. Verständnis Vorlage Argument Abzug
- 15. Vorlage Vorlage Funktionen und Parameter Abzug
- 16. Vorlage für Typ sicher C++ 11 enum Klasse Flags
- 17. Vorlage Argument Abzug gescheitert, SFINAE
- 18. Typ Abzug von const Referenzen in Vorlagenfunktionen
- 19. Rückgabetyp Abzug in C++ 14
- 20. Auto-Abzug für Const-Klasse Mitglied
- 21. Werttyp Abzug von nicht-Typ Template-Parameter
- 22. Aliasing Funktion Vorlage mit bekanntem Typ
- 23. Vorlage Freund Funktion einer Vorlage Klasse
- 24. Typ Fehler in einer Vorlage-Funktion
- 25. Vorlage einer Klasse, die eine Konstante-Typ-Vorlage enthält?
- 26. Vorlage: Der Abzug von Array-Größe gescheitert
- 27. Verschachtelter Typ: Struktur vs Klasse
- 28. Verkürzte Funktion Vorlage vs. Funktion Vorlage mit Forwarding Referenz param
- 29. Typ/Wert Mismatch in Vorlage C++ Klassendeklaration
- 30. variadic Vorlage in verschachtelten Klasse
Haben Sie 'std :: vector a sprechen (1, wahr); 'oder über' std :: vector v = std :: vector (1, wahr); '? Die erste wird "wahre" Deduktion sein, während die zweite ein bereits bekanntes Argument erfordert. Beachten Sie die Komplikation der expliziten Spezialisierung bool-vector. –
Der erste, wahre Abzug, ist das nicht möglich? – yesraaj
Ich habe gerade Bjarne Stroustrups Argument dafür gefunden, dies in der Sprache nicht zu berücksichtigen. –