This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch] Use variadic templates for tr1::is_function


Paolo Carlini wrote:

Hi all, hi Doug,

I'm finishing regtesting the below, which I consider better than instantiating a lot of templates for a single trait and/or using something like the old __in_array. Do you agree?

In any case, better this way, otherwise we run into problems with member functions.


Paolo.

////////////////
Index: include/tr1/type_traits
===================================================================
--- include/tr1/type_traits	(revision 123691)
+++ include/tr1/type_traits	(working copy)
@@ -34,6 +34,8 @@
 #ifndef _TR1_TYPE_TRAITS
 #define _TR1_TYPE_TRAITS 1
 
+#pragma GCC system_header
+
 #include <bits/c++config.h>
 #include <tr1/type_traits_fwd.h>
 
@@ -171,14 +173,22 @@
     : public integral_constant<bool, __is_class(_Tp)>
     { };
 
+  template<typename>
+    struct __is_function_helper
+    : public false_type { };
+
+  template<typename _Res, typename... _ArgTypes>
+    struct __is_function_helper<_Res(_ArgTypes...)>
+    : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes>
+    struct __is_function_helper<_Res(_ArgTypes..., ...)>
+    : public true_type { };
+
   template<typename _Tp>
     struct is_function
-    : public integral_constant<bool, !(is_void<_Tp>::value
-				       || is_scalar<_Tp>::value
-				       || is_array<_Tp>::value				       
-				       || is_reference<_Tp>::value
-				       || is_union<_Tp>::value
-				       || is_class<_Tp>::value)>
+    : public integral_constant<bool, (__is_function_helper<typename
+				      remove_cv<_Tp>::type>::value)>
     { };
 
   /// @brief  composite type traits [4.5.2].
Index: testsuite/tr1/4_metaprogramming/primary_type_categories/is_function/is_function.cc
===================================================================
--- testsuite/tr1/4_metaprogramming/primary_type_categories/is_function/is_function.cc	(revision 123691)
+++ testsuite/tr1/4_metaprogramming/primary_type_categories/is_function/is_function.cc	(working copy)
@@ -1,6 +1,6 @@
 // 2004-12-16  Paolo Carlini  <pcarlini@suse.de>
 //
-// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -34,6 +34,7 @@
   VERIFY( (test_category<is_function, int (int)>(true)) );
   VERIFY( (test_category<is_function, ClassType (ClassType)>(true)) );
   VERIFY( (test_category<is_function, float (int, float, int[], int&)>(true)) );
+  VERIFY( (test_category<is_function, int (int, ...)>(true)) );
 
   // Negative tests.
   VERIFY( (test_category<is_function, int&>(false)) );

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]