On 6 Mag, 16:21, "Roman.Perepeli...@[EMAIL PROTECTED]
"
<Roman.Perepeli...@[EMAIL PROTECTED]
> wrote:
>
>
> Alexandre Courpron modified is_call_possible to create
> is_exact_call_possible. You can find implementation
here:http://groups.google.co.uk/group/comp.lang.c++.moderated/browse_threa...
I have quickly checked the link and it surely deserves a deeper read
when I found a bit of time.
Anyhow here is my much simpler solution...so simple that is probably
broken in some way, but I cannot find where:
/* Check if a function/functor Fun has a given signature Sig */
template<typename Fun, typename Sig>
struct is_compatible
{
typedef typename boost::remove_pointer<Fun>::type F;
/* Build pointer_to_member types from the given signature */
typedef typename pointer_to_member<is_function<F>::value, F,
Sig>::type ptm;
typedef typename pointer_to_member<is_function<F>::value, F,
Sig>::const_type ptm_const;
/* Check for a function */
template<class U> static
yes_type detect(typename enable_if<is_same<U, Sig> >::type*);
/* Check for a functor, either const and non-const members are
detected */
template<ptm> struct helper;
template<ptm_const> struct helper_const;
template<class U> static
yes_type detect(helper<&U::operator()>*);
template<class U> static
yes_type detect(helper_const<&U::operator()>*);
/* Default */
template<class U> static
no_type detect(...);
static const bool
value = (sizeof(detect<F>(0)) == sizeof(yes_type));
};
Where template pointer_to_member<> is:
/* Convert a signature type Sig to a pointer_to_member type */
template<int is_function, typename T, typename Sig>
struct pointer_to_member;
template<typename T, typename Sig>
struct pointer_to_member<1, T, Sig> // filter out function types
{
typedef int type;
typedef int const_type;
};
template<typename T, typename R>
struct pointer_to_member<0, T, R()>
{
typedef R(T::* type) ();
typedef R(T::* const_type)() const;
};
template<typename T, typename R, typename A0>
struct pointer_to_member<0, T, R(A0)>
{
typedef R(T::* type)(A0);
typedef R(T::* const_type)(A0) const;
};
...... and so on for each argument arity ........
BTW it seems to work.
Thanks
Marco
--
[ See http://www.gotw.ca/resources/clcm.htm
for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]


|