This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: [Patch] Use variadic templates for tr1::is_function
- From: Paolo Carlini <pcarlini at suse dot de>
- To: Paolo Carlini <pcarlini at suse dot de>
- Cc: libstdc++ <libstdc++ at gcc dot gnu dot org>, Douglas Gregor <doug dot gregor at gmail dot com>
- Date: Tue, 10 Apr 2007 15:42:14 +0200
- Subject: Re: [Patch] Use variadic templates for tr1::is_function
- References: <461B890F.205@suse.de>
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)) );