|
Boost : |
From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2002-11-11 04:56:13
Douglas Gregor wrote:
> Yep. We just need:
>
> template<typename T> T get();
>
> template<typename Functor, typename R, typename T1, typename T2, ...,
> typename TN>
> struct is_callable :
>
> mpl::bool_c<__is_well_formed(static_cast<R>(get<Functor>()(get<T1>(),
> get<T2>(), ..., get<TN>())))>
> {
> };
Hmm, interesting, so if this actually worked, we would be happy:
#include "boost/static_assert.hpp"
typedef char (&no_tag)[1];
typedef char (&yes_tag)[2];
template< long > struct sink { typedef sink type; };
template<typename T> T get();
template< typename Functor, typename R, typename T1 >
no_tag is_callable_helper(...);
template< typename Functor, typename R, typename T1 >
yes_tag is_callable_helper(
typename sink<
sizeof(static_cast<R>(get<Functor>()( get<T1>() )))
>::type*
);
template<
typename Functor, typename R, typename T1
>
struct is_callable
{
BOOST_STATIC_CONSTANT(bool
, value = sizeof(is_callable_helper<Functor,R,T1>(0))
== sizeof(yes_tag)
);
};
struct her {};
struct my { int operator()(int); };
BOOST_STATIC_ASSERT((!is_callable<int,int,int>::value));
BOOST_STATIC_ASSERT((!is_callable<her,int,int>::value));
BOOST_STATIC_ASSERT((is_callable<my,int,int>::value));
?
>
> The reason I mention is_instantiable instead of __is_well_formed
> is that is_instantiable can keep a class template interface, whereas
> __is_well_formed would require a new grammar production.
>From http://aspn.activestate.com/ASPN/Mail/Message/1412095 I've got an
impression that implementors are not too concerned about it.
After all, '__is_well_formed' might be as easy to implement as this:
void process_is_well_formed( args )
{
try
{
process_sizeof( args );
args.expression_result = true;
}
catch (compiler_error const& )
{
args.expression_result = false;
}
}
:)
Aleksey
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk