[cfe-commits] [libcxx] r132363 - /libcxx/trunk/include/functional

Howard Hinnant hhinnant at apple.com
Tue May 31 14:45:26 PDT 2011


Author: hhinnant
Date: Tue May 31 16:45:26 2011
New Revision: 132363

URL: http://llvm.org/viewvc/llvm-project?rev=132363&view=rev
Log:
I've seen this question enough times to know that it should be fixed: http://stackoverflow.com/questions/6193734/implicit-conversions-with-stdfunction

Modified:
    libcxx/trunk/include/functional

Modified: libcxx/trunk/include/functional
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/functional?rev=132363&r1=132362&r2=132363&view=diff
==============================================================================
--- libcxx/trunk/include/functional (original)
+++ libcxx/trunk/include/functional Tue May 31 16:45:26 2011
@@ -1101,6 +1101,21 @@
     template <class _R2, class ..._A>
         _LIBCPP_INLINE_VISIBILITY
         static bool __not_null(const function<_R(_A...)>& __p) {return __p;}
+
+    template <class _F, bool = __invokable<_F&, _ArgTypes...>::value>
+        struct __callable;
+    template <class _F>
+        struct __callable<_F, true>
+        {
+            static const bool value =
+                is_convertible<typename __invoke_of<_F&, _ArgTypes...>::type,
+                               _R>::value;
+        };
+    template <class _F>
+        struct __callable<_F, false>
+        {
+            static const bool value = false;
+        };
 public:
     typedef _R result_type;
 
@@ -1113,7 +1128,7 @@
     function(function&&) _NOEXCEPT;
     template<class _F>
       function(_F,
-               typename enable_if<!is_integral<_F>::value>::type* = 0);
+               typename enable_if<__callable<_F>::value>::type* = 0);
 
     template<class _Alloc>
       _LIBCPP_INLINE_VISIBILITY
@@ -1127,7 +1142,7 @@
       function(allocator_arg_t, const _Alloc&, function&&);
     template<class _F, class _Alloc>
       function(allocator_arg_t, const _Alloc& __a, _F __f,
-               typename enable_if<!is_integral<_F>::value>::type* = 0);
+               typename enable_if<__callable<_F>::value>::type* = 0);
 
     function& operator=(const function&);
     function& operator=(function&&) _NOEXCEPT;
@@ -1135,7 +1150,7 @@
     template<class _F>
       typename enable_if
       <
-        !is_integral<typename decay<_F>::type>::value,
+        __callable<typename decay<_F>::type>::value,
         function&
       >::type
       operator=(_F&&);
@@ -1239,7 +1254,7 @@
 template<class _R, class ..._ArgTypes>
 template <class _F>
 function<_R(_ArgTypes...)>::function(_F __f,
-                                     typename enable_if<!is_integral<_F>::value>::type*)
+                                     typename enable_if<__callable<_F>::value>::type*)
     : __f_(0)
 {
     if (__not_null(__f))
@@ -1265,7 +1280,7 @@
 template<class _R, class ..._ArgTypes>
 template <class _F, class _Alloc>
 function<_R(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a0, _F __f,
-                                     typename enable_if<!is_integral<_F>::value>::type*)
+                                     typename enable_if<__callable<_F>::value>::type*)
     : __f_(0)
 {
     typedef allocator_traits<_Alloc> __alloc_traits;
@@ -1341,7 +1356,7 @@
 template <class _F>
 typename enable_if
 <
-    !is_integral<typename decay<_F>::type>::value,
+    function<_R(_ArgTypes...)>::template __callable<typename decay<_F>::type>::value,
     function<_R(_ArgTypes...)>&
 >::type
 function<_R(_ArgTypes...)>::operator=(_F&& __f)





More information about the cfe-commits mailing list