source: NonGTP/Boost/boost/type_traits/is_function.hpp @ 857

Revision 857, 2.5 KB checked in by igarcia, 18 years ago (diff)
Line 
1
2//  Copyright 2000 John Maddock (john@johnmaddock.co.uk)
3//  Copyright 2002 Aleksey Gurtovoy (agurtovoy@meta-comm.com)
4//
5//  Use, modification and distribution are subject to the Boost Software License,
6//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7//  http://www.boost.org/LICENSE_1_0.txt).
8//
9//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
10
11#ifndef BOOST_TT_IS_FUNCTION_HPP_INCLUDED
12#define BOOST_TT_IS_FUNCTION_HPP_INCLUDED
13
14#include "boost/type_traits/is_reference.hpp"
15#include "boost/type_traits/detail/false_result.hpp"
16#include "boost/config.hpp"
17
18#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS)
19#   include "boost/type_traits/detail/is_function_ptr_helper.hpp"
20#else
21#   include "boost/type_traits/detail/is_function_ptr_tester.hpp"
22#   include "boost/type_traits/detail/yes_no_type.hpp"
23#endif
24
25// should be the last #include
26#include "boost/type_traits/detail/bool_trait_def.hpp"
27
28// is a type a function?
29// Please note that this implementation is unnecessarily complex:
30// we could just use !is_convertible<T*, const volatile void*>::value,
31// except that some compilers erroneously allow conversions from
32// function pointers to void*.
33
34namespace boost {
35namespace detail {
36
37#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS)
38template<bool is_ref = true>
39struct is_function_chooser
40    : ::boost::type_traits::false_result
41{
42};
43
44template <>
45struct is_function_chooser<false>
46{
47    template< typename T > struct result_
48        : ::boost::type_traits::is_function_ptr_helper<T*>
49    {
50    };
51};
52
53template <typename T>
54struct is_function_impl
55    : is_function_chooser< ::boost::is_reference<T>::value >
56        ::BOOST_NESTED_TEMPLATE result_<T>
57{
58};
59
60#else
61
62template <typename T>
63struct is_function_impl
64{
65    static T* t;
66    BOOST_STATIC_CONSTANT(
67        bool, value = sizeof(::boost::type_traits::is_function_ptr_tester(t))
68        == sizeof(::boost::type_traits::yes_type)
69        );
70};
71
72#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
73template <typename T>
74struct is_function_impl<T&> : public false_type
75{};
76#endif
77
78#endif
79
80} // namespace detail
81
82BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_function,T,::boost::detail::is_function_impl<T>::value)
83
84} // namespace boost
85
86#include "boost/type_traits/detail/bool_trait_undef.hpp"
87
88#endif // BOOST_TT_IS_FUNCTION_HPP_INCLUDED
Note: See TracBrowser for help on using the repository browser.