|
Boost Users : |
From: Ovanes Markarian (om_boost_at_[hidden])
Date: 2006-12-29 10:39:31
Hi!
I am trying to create a static visitor using metapgramming. This approach worked fine in some test
code, but now I face some problems.
Let me first show some example:
I've define an item_visitor template class:
template <class Pair> //mpl::pair obtained from map sequence
struct item_visitor
{
public:
typedef typename Pair::second value_type;
virtual void visit(value_type const& t)
{
assert(0 && "This function must be overriden in the concrete handler class!");
}
};
template<class Seq>
struct base_sequence_visitor
: public boost::mpl::inherit_linearly
<
Seq
, boost::mpl::inherit<boost::mpl::_1, item_visitor<boost::mpl::_2> >
>::type
{};
This example works fine and I can dispatch my type.
Now I have some additional type, which provides a view to my structure. And I would like my visit
to implemented as:
virtual void visit(GenericView<Pair::second> const& t)
{ ... }
In such a case I have to introduce a second parameter to the item_visitor template:
template<class Pair, template<class> SomeView>
struct item_visitor { ... };
Therefore the base_sequence_visitor must be updated as well to forward the View template:
template<class Seq, template<class> SomeView>
struct base_sequence_visitor
: public boost::mpl::inherit_linearly
<
Seq
, boost::mpl::inherit<boost::mpl::_1, item_visitor<boost::mpl::_2, SomeView> >
>::type
{};
Using this construct I get an error, that mpl::arg<2> does not have a type second. That means that
the placeholder _2 does not get expanded. So I tried to "code around" and used the following
trick:
template<class>
calss SomeView;
template<class Pair>
struct some_visitor : item_visitor<Pair, SomeView>
{};
Then I added to the base_sequence_visitor template an additional argument, which specifies an item
visitor class to be used:
template<class Seq, template<class> ItemVisitor>
struct base_sequence_visitor
: public boost::mpl::inherit_linearly
<
Seq
, boost::mpl::inherit<boost::mpl::_1, ItemVisitor<boost::mpl::_2> >
>::type
{};
And it compiles fine! But when I try to cast the base_sequence_visitor to some complete
item_visitor type, which is really in the sequence I receive a compiler error, that
cannot convert from 'base_sequence_visitor<Seq,ItemVisitor>' to
'ClassWhereSimpleVisitorIsDefined::simple_visitor<PairType> &'
Do I miss something?
With Kind Regards,
Ovanes Markarian
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net