#include <functional>
#include <vector>
using namespace std;
struct MultiMemoizator {
template <typename ReturnType, typename... Args>
ReturnType callFunction(std::function<ReturnType(Args...)> memFunc, Args&&... args) {
}
};
typedef vector<double> vecD;
vecD sort_vec (vecD const& vec) {
return vec;
}
int main()
{
vecD vec;
std::function<vecD(vecD)> sortFunc(sort_vec);
MultiMemoizator mem;
mem.callFunction<vecD, vecD>(sortFunc, vec);
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpzdHJ1Y3QgTXVsdGlNZW1vaXphdG9yIHsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXR1cm5UeXBlLCB0eXBlbmFtZS4uLiBBcmdzPgogICAgUmV0dXJuVHlwZSBjYWxsRnVuY3Rpb24oc3RkOjpmdW5jdGlvbjxSZXR1cm5UeXBlKEFyZ3MuLi4pPiBtZW1GdW5jLCBBcmdzJiYuLi4gYXJncykgewoKICAgIH0KfTsKCnR5cGVkZWYgdmVjdG9yPGRvdWJsZT4gdmVjRDsKCnZlY0Qgc29ydF92ZWMgKHZlY0QgY29uc3QmIHZlYykgewogICAgcmV0dXJuIHZlYzsKfQoKaW50IG1haW4oKQp7CiAgICB2ZWNEIHZlYzsKICAgIHN0ZDo6ZnVuY3Rpb248dmVjRCh2ZWNEKT4gc29ydEZ1bmMoc29ydF92ZWMpOwogICAgTXVsdGlNZW1vaXphdG9yIG1lbTsKICAgIG1lbS5jYWxsRnVuY3Rpb248dmVjRCwgdmVjRD4oc29ydEZ1bmMsIHZlYyk7Cn0K
prog.cpp: In function 'int main()':
prog.cpp:23:47: error: no matching function for call to 'MultiMemoizator::callFunction(std::function<std::vector<double>(std::vector<double>)>&, vecD&)'
mem.callFunction<vecD, vecD>(sortFunc, vec);
^
prog.cpp:7:16: note: candidate: template<class ReturnType, class ... Args> ReturnType MultiMemoizator::callFunction(std::function<_Res(_ArgTypes ...)>, Args&& ...)
ReturnType callFunction(std::function<ReturnType(Args...)> memFunc, Args&&... args) {
^
prog.cpp:7:16: note: template argument deduction/substitution failed:
prog.cpp:23:47: note: cannot convert 'vec' (type 'vecD {aka std::vector<double>}') to type 'std::vector<double>&&'
mem.callFunction<vecD, vecD>(sortFunc, vec);
^