9 #ifndef BOOST_MULTI_INDEX_DETAIL_IS_TRANSPARENT_HPP
10 #define BOOST_MULTI_INDEX_DETAIL_IS_TRANSPARENT_HPP
22 namespace multi_index{
31 template<
typename F,
typename Arg1,
typename Arg2,
typename=
void>
40 #if !defined(BOOST_NO_SFINAE)&&!defined(BOOST_NO_SFINAE_EXPR)&& \
41 !defined(BOOST_NO_CXX11_DECLTYPE)&& \
42 (defined(BOOST_NO_CXX11_FINAL)||defined(BOOST_IS_FINAL))
58 namespace multi_index{
62 struct not_is_transparent_result_type{};
64 template<
typename F,
typename Arg1,
typename Arg2>
65 struct is_transparent_class_helper:F
68 template<
typename T,
typename Q>
69 not_is_transparent_result_type
operator()(
const T&,
const Q&)
const;
72 template<
typename F,
typename Arg1,
typename Arg2,
typename=
void>
75 template<
typename F,
typename Arg1,
typename Arg2>
76 struct is_transparent_class<
81 declval<const is_transparent_class_helper<F,Arg1,Arg2> >()(
82 declval<const Arg1&>(),declval<const Arg2&>())
84 not_is_transparent_result_type
89 template<
typename F,
typename Arg1,
typename Arg2>
90 struct is_transparent<
95 mpl::not_<is_final<F> >
98 >:is_transparent_class<F,Arg1,Arg2>{};
100 template<
typename F,
typename Arg1,
typename Arg2,
typename=
void>
103 template<
typename F,
typename Arg1,
typename Arg2>
104 struct is_transparent_function<
109 is_same<typename function_traits<F>::arg1_type,const Arg1&>,
110 is_same<typename function_traits<F>::arg1_type,Arg1>
113 is_same<typename function_traits<F>::arg2_type,const Arg2&>,
114 is_same<typename function_traits<F>::arg2_type,Arg2>
120 template<
typename F,
typename Arg1,
typename Arg2>
121 struct is_transparent<
124 is_function<typename remove_pointer<F>::type>
126 >:is_transparent_function<typename remove_pointer<F>::type,Arg1,Arg2>{};