0

Ich habe diesen Code:Wie Lvalue-Referenz weiterleiten?

struct MultiMemoizator { 
    template <typename ReturnType, typename... Args> 
    ReturnType callFunction(std::function<ReturnType(Args...)> memFunc, const Args&... args) { 
     return memFunc(args ...); 
    } 
}; 

int main() 
{ 
    typedef vector<double> vecD; 
    //filling vecD with random numbers... 
    MultiMemoizator mem; 
    function<vecD(vecD)> sort_vec = [](vecD &vec) { 
     sort(vec.begin(),vec.end()); 
     return vec; 
    }; 
    mem.callFunction<vecD,vecD>(sort_vec,vec); 
    //vec is still not sorted! 
} 

Da memFunc(args ...);, was passiert, ist, dass eine Kopie von args sortiert und nicht vec, so dass am Ende vec nach callFunction(...) unsortiert sein wird.

Ich denke, dass, um dieses Problem zu lösen forward kann mir helfen, aber wenn ich versuche: return cachedFunc(forward<Args>(args) ...); dann etwas Schlimmes passiert (wie vector::size=0).

Wie kann ich args Referenz auf sort_vec weiterleiten?

+0

Ich * denke * du würdest nur vorwärts brauchen, wenn du 'const Args && ... args' hättest. – kfsone

Antwort

1

Geben Sie den Rückgabetyp als Type& oder const Type& an und geben Sie etwas zurück, das kein temporärer Wert ist. So:

function<vecD&(vecD&)> sort_vec = [](vecD &vec) -> vecD& { 
    std::sort(vec.begin(),vec.end()); 
    return vec; 
}; 

P. S. Sie versuchen, const Vektor zu sortieren.