3 @Copyright Barrett Adair 2015-2017
4 Distributed under the Boost Software License, Version 1.0.
5 (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
9 #ifndef BOOST_CLBL_TRTS_DETAIL_PMD_HPP
10 #define BOOST_CLBL_TRTS_DETAIL_PMD_HPP
12 #include <boost/callable_traits/detail/forward_declarations.hpp>
13 #include <boost/callable_traits/detail/function.hpp>
14 #include <boost/callable_traits/detail/traits.hpp>
15 #include <boost/callable_traits/detail/default_callable_traits.hpp>
16 #include <boost/callable_traits/detail/utility.hpp>
18 namespace boost { namespace callable_traits { namespace detail {
21 struct pmd : default_callable_traits<T> {};
23 template<typename D, typename T>
24 struct pmd<D T::*> : default_callable_traits<> {
26 static constexpr bool value = true;
30 using invoke_type = T const &;
32 using function_type = typename std::add_lvalue_reference<D>::type(invoke_type);
33 using qualified_function_type = D(invoke_type);
34 using arg_types = std::tuple<invoke_type>;
35 using non_invoke_arg_types = std::tuple<>;
37 using return_type = typename std::add_lvalue_reference<D>::type;
40 using apply_member_pointer = D C::*;
43 using apply_return = R T::*;
45 template<template<class...> class Container>
46 using expand_args = Container<invoke_type>;
48 using is_member_pointer = std::true_type;
51 }}} // namespace boost::callable_traits::detail