我需要扩展一个元组,以便我可以将它的参数应用于函数。写起来非常容易。
template<template<class...> class Tup, class... Ts, class F>
decltype(auto) apply(F f, Tup<Ts...> &tup){
return f(std::forward<Ts>(std::get<Ts>(tup))...);
}
它可以像这样使用
auto it = std::make_tuple(1,2);
cout << apply([](int a, int b){return a + b;},it) << endl;
但是如果我真的想将元组的元素移动到函数中呢?
所以我尝试了更通用的东西
template<template<class...> class Tup, class... Ts, class F>
decltype(auto) apply(F f, Tup<Ts...> &&tup){
return f(std::forward<Ts>(std::get<Ts>(tup))...);
}
但它只适用于rvalues
auto it = std::make_tuple(1,2);
cout << apply([](int a, int b){return a + b;},std::move(it)) << endl;
对于左值参考,我得到了
error: no matching function for call to 'apply'
cout << apply([](int a, int b){return a + b;},it) << endl;
^~~~~
我做错了什么?
编辑:这可能不是最好的例子,因为我使用的是始终被复制的内容。