
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 :
This is even simpler : template<typename T> struct readonly : proto::callable { typedef const T& result_type; }; template<typename T> struct readwrite : proto::callable { typedef T& result_type; }; template<int N, typename T> struct argtype : proto::or_< proto::when<proto::assign<arg<N>, proto::_>, readwrite<T>()> , proto::otherwise<readonly<T>()>
{}; namespace boost { namespace proto { template<class T> struct is_callable< readonly<T> > : mpl::true_ {}; template<class T> struct is_callable< readwrite<T> > : mpl::true_ {}; } } Manjunath http://nonchalantlytyped.net/blog/musings/
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