// The point of this meta function is to extract the contents of the
// tuple as a parameter pack so we can pass it into std::result_of<>.
-template<class F, class Args> struct ReturnValue {};
+template<class F, class Args> struct ReturnValue;
template<class F, class ...Args>
struct ReturnValue<F,std::tuple<Args...>> {
typedef typename std::result_of<F (Args...)>::type type;
template<class Callable, class Tuple>
typename detail::ReturnValue<
typename std::decay<Callable>::type,
- typename std::remove_reference<Tuple>::type
+ typename std::decay<Tuple>::type
>::type
applyTuple(const Callable& c, Tuple&& t) {
typedef typename detail::ReturnValue<
typename std::decay<Callable>::type,
- typename std::remove_reference<Tuple>::type
+ typename std::decay<Tuple>::type
>::type RetT;
return detail::CallTuple<RetT>::call(c, std::forward<Tuple>(t));
}
: f_(std::move(f))
, args_(std::move(args))
{}
- GuardObj(GuardObj&& g)
+ GuardObj(GuardObj&& g) noexcept
: GuardObjBase(std::move(g))
, f_(std::move(g.f_))
, args_(std::move(g.args_))
Mover m;
folly::applyTuple(move_only_func,
std::forward_as_tuple(std::forward<Mover>(Mover())));
+ const auto tuple3 = std::make_tuple(1, 2, 3.0);
+ folly::applyTuple(func, tuple3);
}