
On Thu, May 6, 2010 at 2:13 AM, joel falcou <joel.falcou@lri.fr> wrote:
Moreover, your result are wrong
result_of<T()> will always return void.
You need somethign like:
Thanks, Joel. (Note to self : RTFM more often :)). I also discovered that I didn't have to make the readonly and readwrite classes templated. The following also works : struct readonly : proto::callable { template<typename Sig> struct result; template<typename This, typename T> struct result<This(T)> { typedef const T& type; }; }; struct readwrite : proto::callable { template<typename Sig> struct result; template<typename This, typename T> struct result<This(T)> { typedef T& type; }; }; template<int N, typename T> struct argtype : proto::or_< proto::when<proto::assign<arg<N>, proto::_>, readwrite(T())> , proto::otherwise<readonly(T())>
{}; Manjunath http://nonchalantlytyped.net/blog/musings/
struct arg_tag {};
namespace proto = boost::proto; namespace mpl = boost::mpl;
using namespace std;
template<int N> struct arg : proto::or_<proto::nullary_expr<arg_tag, mpl::int_<N> > > {};
template<typename T> struct readonly : proto::callable {
template<typename Sig> struct result;
template<typename This,class X> struct result<This(X)> { typedef const T& type; }; };
template<typename T> struct readwrite : proto::callable {
template<typename Sig> struct result;
template<typename This,class X> struct result<This(X)> { typedef T& type; }; };
template<int N, typename T> struct argtype : proto::or_< proto::when<proto::assign<arg<N>, proto::_>, readwrite<T>(proto::_)> , proto::otherwise<readonly<T>(proto::_)>
{};
proto::nullary_expr<arg_tag, mpl::int_<0> >::type const _1 = {{}}; proto::nullary_expr<arg_tag, mpl::int_<1> >::type const _2 = {{}};
namespace boost { namespace proto { template<class T> struct is_callable<readwrite<T> > : true_ {}; template<class T> struct is_callable<readonly<T> > : true_ {}; }}
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users