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:

  1. Wenn ich die ändern-Funktion name muss ich ändern

    decltype(test())

    in

    decltype(name())

  2. 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}; und auto 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 mit typename und irgendwann auch template, ist schwieriger zu verstehen, aber ich versuche, beschränke mich auto 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 sagt auto 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 und decltype ist der Komfort im Vergleich zu typedef 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ück reference_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ück int& 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 des std::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!

InformationsquelleAutor Luke Givens | 2014-01-28
Schreibe einen Kommentar