Gibt es eine sinnvolle Verwendung einer Funktion, die eine anonyme Struktur zurückgibt?

Hier ist ein (künstliches) Beispiel für die Verwendung einer Funktion, die eine anonyme Struktur zurückgibt und "etwas" Nützliches tut:

#include <iostream>

template<typename T>
T* func(T* t, float a, float b) {
    if(!t) {
        t = new T;
        t->a = a;
        t->b = b;
    } else {
        t->a += a;
        t->b += b;
    }
    return t;
}

struct {
    float a, b;
}* foo(float a, float b) {
    if(a==0) return 0;
    return func(foo(a-1,b), a, b);
}

int main() {
    std::cout << foo(5,6)->a << std::endl;
    std::cout << foo(5,6)->b << std::endl;

    void* v = (void*)(foo(5,6));
    //[1] delete f now because I know struct is floats only.
    float* f = (float*)(v);

    std::cout << f[0] << std::endl;
    std::cout << f[1] << std::endl;

    delete[] f;

    return 0;
}

Es gibt ein paar Punkte, die ich diskutieren möchte:

Als sich herausstellt, dass dieser Code leckt, kann ich trotzdem NICHT lecken, ohne zu wissen, was die zugrunde liegende Strukturdefinition ist? siehe Kommentar [1]. Ich muss einen Zeiger auf eine anonyme Struktur zurückgeben, damit ich eine Instanz des Objekts innerhalb der templatisierten Funktion erstellen kann.func, kann ich etwas Ähnliches tun, ohne einen Zeiger zurückzugeben?Ich denke, das Wichtigste ist, gibt es überhaupt eine (reale) Verwendung dafür? Da das oben angegebene Beispiel undicht und zugegebenermaßen erfunden ist.

Übrigens, was die Funktionfoo(a,b) bedeutet, eine Struktur mit zwei Zahlen, der Summe aller Zahlen von 1 bis a und dem Produkt von a und b, zurückzugeben.

Vielleicht die Linienew T könnte ein boost :: shared_ptr benutzen, um Lecks zu vermeiden, aber das habe ich nicht versucht. Funktioniert das

Ich glaube, ich habe nur versucht, die anonyme Struktur als Array von Floats zu löschen, so etwas wie float * f = new float [2]. Was könnte falsch sein, wie der Kommentar unten andeutet, also was kann getan werden? kann ich überhaupt löschen?

Ich kann diesen Code "wie besehen" auf VS2008 kompilieren und ausführen. Möglicherweise werden von VS einige nicht standardmäßige Erweiterungen verwendet, aber er wird ausgeführt und gibt 15 und 30 als Antwort.

Von den Antworten glaube ich, dass dieses Gerät eine VS2008-spezifische Entität ist, es ist nicht standardkonform und daher nicht portabel. Schade aber, ich hätte gerne gesehen, mit welchem Voodoo die Stackoverflow- oder Boost-Leute gekommen sind, wenn das in ihrem Arsenal wäre :). Vielen Dank an alle.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage