0

У меня есть этот код:Как переслать ссылку на lvalue?

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! 
} 

Поскольку memFunc(args ...); случается что копия args сортируется и не vec, так что в конце vec будет несортированный после callFunction(...).

Я думаю, что для решения этой проблемы forward может мне помочь, но если я попробую: return cachedFunc(forward<Args>(args) ...);, тогда произойдет что-то плохое (например, vector::size=0).

Как я могу направить args ссылку на sort_vec?

+0

I * think * вам понадобится только переслать, если у вас есть 'const Args && ... args'. – kfsone

ответ

1

указать тип возврата как Type& или const Type& и вернуть то, что не является временным значением. Как это:

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

P.S. вы пытаетесь сортировать const вектор.