On 11/1/2010 12:59 PM, Manjunath Kudlur wrote:
2) To provide a map-like container in which I can store things like boost::any objects. OK, maybe this is not for Proto to address but though it might still have something to offer...
Have you checked out Boost.Fusion map or vector for this purpose?
Second this. You do *not* want to use boost::any for this as you will
lose all type safety and optimization opportunities. Here's the basic
strategy:
Define tags like this:
template<typename T>
struct arg_ { typedef T type; };
template<typename T>
struct arg
: proto::terminal
{};
struct x_ {};
struct y_ {};
arg::type const x = {{}};
arg::type const y = {{}};
Now you have placeholders named x and y to play with. Now this:
lam(x, y)
should return some object that:
1) Has a member typedef for mpl::vector
2) Has an operator() member that accepts a Proto expression
The operator() in (2) above should return an object that:
1) Holds the Proto expression (by reference)
2) Has the mpl::vector of tags as a member typedef
3) Has an operator() member that accepts arguments for the lambda
The operator() in (3) above should have the same arity as the
mpl::vector of tags. It should take the arguments and put them in a
fusion::vector. Then it takes the mpl::vector of tags and the
fusion::vector of arguments and turn it into a fusion::map. This map
will be used as the state parameter when evaluating the Proto expression
(along with the map) with the following Proto algorithm:
struct at_key : proto::callable
{
template<typename Sig>
struct result;
template
struct result
: fusion::result_of::at_key<
typename boost::remove_reference<Map>::type
, typename boost::remove_const<
typename boost::remove_reference<Key>::type
>::type
>
{};
template
typename fusion::result_of::at_key