C++ decltype Aufzucht aktuellen Funktion zurückgegebenen Typ
Ich würde gerne automatisch ableiten, den zurückgegebenen Typ der Funktion, die ich Schreibe.
Beispiel:
std::vector<int> test(){
decltype(this_function) ret;
ret.push_back(5);
ret.push_back(9);
return ret;
}
Bisher die beste, die ich erreicht haben ist
std::vector<int> test(){
decltype(test()) ret;
ret.push_back(5);
ret.push_back(9);
return ret;
}
Wich, funktioniert aber:
-
Wenn ich die ändern-Funktion name muss ich ändern
decltype(test())
in
decltype(name())
-
Wenn ich die ändern-Funktion Parameter ich ändern muss, sowie
decltype(test())
in
decltype(test(param1,param2))
Gibt es eine elegantere Art, das gleiche zu tun?
- Die changing-Parameter-problem gelöst werden kann, aber nicht die Funktion-umbenennen.
- Warum nicht verwenden eine template-Funktion? wenn wäre so einfach wie T-test(){ T ret ...
- stackoverflow.com/q/13286605/1147772
- Kannst du ein Aktuelles Beispiel, wo dies nötig wäre? Hier kann der Typ von ausgelassen mit
return {5,9};
undauto
hilft in den meisten Fällen. - AFAIK gibt es keine Möglichkeit, sauber zu tun, C++ fehlt die Funktion. D hat dies als
typeof(return)
zum Beispiel. - FWIW, In C++14 werden Sie in der Lage zu tun das Gegenteil.
- Ich Frage mich manchmal, warum Menschen versuchen diesem schwer, nicht zu kopieren und ein paar der Charaktere aus der vorherigen Zeile... denkst du, dieses wäre besser lesbar? Sind Sie unter der Annahme, dass die Veränderung der return-Typ in der Deklaration kann man ohne Blick in die definition?
- Ich möchte keine Werbung machen es zu viel, vielleicht die Leute wollen, es zu benutzen! [Und ich nicht besonders wie die Idee :)]
- Ich habe gesehen, dass, aber ich mag diesen Ansatz.. Wenn auch nur gab es eine saubere Art, das zu tun.. In diesem way, Sie würden immer noch die zurückgegebenen Typen in den Kopf... das ist sehr wichtig für die Lesbarkeit IMHO..
- Hoffentlich "Typ der umschließenden Funktion" und "Art der umschließenden Klasse" sind in der Nähe der Spitze der Liste der gewünschten Funktionen, die für die Reflexion SG.
- Ich mag C++14
auto
als return-type-nur in template-meta-Programmierung, wenn der eigentliche Rückgabetyp mittypename
und irgendwann auchtemplate
, ist schwieriger zu verstehen, aber ich versuche, beschränke michauto
für interne Funktionen nur; public API sind in der Regel besser. - aber Sie machen Ihre eigene Funktion, meta-Programmierung unfreundlich. Die abgeleiteten return-Typ einer template-Funktion kann nicht verwendet werden, in einem SFINAE Kontext.
- Zeit für einen down-vote für faule Programmierung
- Ich Frage mich, was passiert mit der standard-Header einmal C++ 14 ist fertig. wenn der header sagt
std::vector<int> foobar()
und die spec sagtauto foobar();
müssten Sie erklären Ihre eigene Funktion auto. da sich c++ - Compiler möglicherweise erhalten Sie unterschiedliche Rückgabe-Typen. es ist also nicht nur sparen einige Zeichen aber geben Bibliothek-Autoren mehr Freiheiten. - Der Standard-Header wird nicht wahrscheinlich verwenden Sie den abgeleiteten Typ, dass ist ein feature orientiert sich an Benutzer-code. Die Norm ist eine, hoffentlich, genaue Spezifikation des Verhaltens, es gehe nicht in details, wie es implementiert ist, aber das interface muss definiert werden (außer in ein paar wichtige Orte, die wenigsten). Beachten Sie auch, dass die abgeleiteten Rückgabetyp legt auch Beschränkungen auf, wie die Funktion implementiert ist (was zurückgegeben werden kann, wie der Typ ist abgeleitet...)
- Ich würde sagen, dass die Konzepte (wenn Sie gehen in C++ 17) sind die zwingenden Dinge im std-Header der Zukunft in der Erwägung, dass
auto
unddecltype
ist der Komfort im Vergleich zutypedef
definieren Typen, in Vorlagen. - Nein, die sind irgendwie orthogonal. Konzepte beschränken, die Eingaben für die Funktion, nicht der Rückgabetyp. Der standard muss noch vorschreiben, dass
std::vector<T>::operator[](size_type)
zurückreference_type
. Wird nicht umgewandelt werden:auto operator[](size_type) { ... return X; }
der standard definiert, was die Funktion zurückgibt, und Sie tut es ohne die Bereitstellung der Umsetzung, was wiederum bedeutet, dass es nicht verwenden können, abgeleitet Rückgabetypen. Darüber hinaus gibt es Einschränkungen, was getan werden kann mit abgeleitet Rückgabetypen, und beschränken die Implementierungen. - Wie ich schon erwähnt, die abgeleiteten Rückgabetyp kann nicht verwendet werden, in SFINAE Kontexten, wird es zu einem schwerwiegenden Fehler. Wenn der standard verlangt, dass
std::vector<int>::operator[]
zurückint&
ist, dann ist Benutzer-code erlaubt ist zu tun:std::is_arithmetic<std::remove_reference<decltype(myvector[0])>::type>::value
in einem SFINAE Kontext, um eine spezielle Implementierung der Funktion für die arithmetische Typen. Wenn die Durchführung desstd::vector
gemacht wurde in Bezug abgeleitet Rückgabetypen der vorherigen Ausdruck wäre ein schwerwiegender Fehler, eher als ein substitutionsfehler auf, dass ein gültiges Programm - abgeleitet Rückgabetyp ist weit entfernt von einem Goldenen hammer, es ist nicht nur, dass Sie nicht missbrauchen, es zu fahren, - Schrauben, es muss nicht einmal fahren Sie alle Nägel!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Namen, den Rückgabetyp?
Bitte Mach mich nicht beschränken, diese mit
enable_if
.enable_if
(wie Sie bereits erwähnt), es ist nicht das gleiche wie eine einzelne Funktion. Zum Beispiel, Sie können diese zu erklären/definieren Sie eine virtuelle Funktion.Die Frage ist paradox:
In diesem Beispiel
hat die Funktion zu übernehmen, die decltype ist ein container-Unterstützung push_back mit einem Wert Typ int. Es gibt keine Möglichkeit, es vorherzusagen. Ändern Sie einfach die return-Typ (doppelklicken) wird es brechen.
Wie etwa :
Ich denke, Sie müssen nicht alles besser, ohne Makros 🙂
test
zu einer Vorlage. Ich spreche von dem Fall, wenntest
ist der eine Vorlage.Blick mag dies seltsam, aber ich denke, es tut, was es tun soll.
Pre-C++1y (und post-C++1y, zu), könnten Sie einen lambda-Ausdruck zu tun, der Rückgabetyp Abzug für Sie, wie in: