X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=folly%2FPartial.h;h=518e91ed673056d03ee4b1baa397d2b63dd6cf2d;hb=c8aadaad37770dc4d1caf2bff239c604b51a6132;hp=248a86a987a3f9be64bb52aa5e5eb2d4ba3a0af2;hpb=ec3d4073a86787ec7e49f48ddc9d8f44a6714ed2;p=folly.git diff --git a/folly/Partial.h b/folly/Partial.h index 248a86a9..518e91ed 100644 --- a/folly/Partial.h +++ b/folly/Partial.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,13 @@ namespace folly { +namespace detail { +namespace partial { + +// helper type to make sure that the templated constructor in Partial does +// not accidentally act as copy or move constructor +struct PartialConstructFromCallable {}; + template class Partial { private: @@ -28,7 +35,7 @@ class Partial { public: template - Partial(Callable&& callable, Args&&... args) + Partial(PartialConstructFromCallable, Callable&& callable, Args&&... args) : f_(std::forward(callable)), stored_args_(std::forward(args)...) {} @@ -69,6 +76,9 @@ class Partial { } }; +} // namespace partial +} // namespace detail + /** * Partially applies arguments to a callable * @@ -92,10 +102,12 @@ class Partial { * and passed to the original callable. */ template -auto partial(F&& f, Args&&... args) -> Partial< +auto partial(F&& f, Args&&... args) -> detail::partial::Partial< typename std::decay::type, std::tuple::type...>> { - return {std::forward(f), std::forward(args)...}; + return {detail::partial::PartialConstructFromCallable{}, + std::forward(f), + std::forward(args)...}; } } // namespace folly