[folly] Enable support of applyTuple for const tuples
authorAlexander Shaposhnikov <alexshap@fb.com>
Tue, 28 Jul 2015 23:35:54 +0000 (16:35 -0700)
committerfacebook-github-bot-4 <folly-bot@fb.com>
Wed, 29 Jul 2015 00:22:22 +0000 (17:22 -0700)
Summary: This diff fixes the helper template ReturnValue to enable using of applyTuple with
constant refs.

Reviewed By: @ot, @ddrcoder

Differential Revision: D2284733

folly/ApplyTuple.h
folly/test/ApplyTupleTest.cpp

index 741429a48abba96eb28f46c1b9702da6ff24e6ea..a592704f080883a3a48433984e8fcb15e37d8d41 100644 (file)
@@ -91,7 +91,7 @@ struct CallTuple {
 
 // 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;
@@ -104,12 +104,12 @@ struct ReturnValue<F,std::tuple<Args...>> {
 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));
 }
index 195bb7b703d3d4a6eb1c8de861d42cae44ddc344..971f5b6d8f4ecc2b6199d7579f3ec86696296a95 100644 (file)
@@ -86,7 +86,7 @@ struct GuardObj : GuardObjBase {
     : 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_))
@@ -163,4 +163,6 @@ TEST(ApplyTuple, Test) {
   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);
 }