Boost logo

Boost :

From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2006-01-17 12:24:24


Arkadiy Vertleyb wrote:
> "Tobias Schwinger" <tschwinger_at_[hidden]> wrote
>
>
>>Most unfortunately the function pointer is not the problem, here.
>>Same problem, except that T should now be:
>>
>> action<anychar_parser, functor>
>>
>>...and MSVC still won't tell us ;-).
>
>
> Can you take the expression whose typeof you are trying to take, and just
> pass it into:
>
> template<class T> void foo(const T&) {}
>

I can. I can also use a function template like

     template<typename T> int eat(T const &) { return 0; }

and

     #define an_expression eat(anychar_p[ a_placeholder ])
     // note: eat(T const &) in place of of the operator+(parser<D> const &)

and it works within Typeof.

Even better (and now things really get weird):

     #define an_expression anychar_p[ a_placeholder ] >> anychar_p
     // note: don't forget to register boost::spirit::sequence<class,class>
     // when trying this one

works. Looking at definition of operator>> in

     boost/spirit/core/composite/sequence.hpp

we see the same deduction. The only differences: it's a binary operator and
heavily overloaded (for one parser argument and the other argument being char,
wchar_t, char const *, wchar_t const *).

So I added a function like this

   template<typename U, typename V>
   int whattheheck(boost::spirit::parser<U> const &,
                   boost::spirit::parser<V> const &)
   { return 0; }

   #define an_expression whattheheck(anychar_p[ a_placeholder ],anychar_p)

and get an error.

Now when I add an overload like this:

   struct surprise { };

   template<typename U>
   int whattheheck(surprise, boost::spirit::parser<U> const &)
   { return 0; }

things work again.

> If it still fails, binding is the problem. We will not solve the problem
> this way, but we'll at least classify it...

Well, I just found a workaround while just replying (the "cardboard programmer" [
http://tinyurl.com/9xcf7 ] effect, I guess).

The workaround isn't too pretty (especially because I still don't really
understand it) but still:

   namespace boost { namespace spirit {

       struct msvc_workaround { };
       int operator+(msvc_workaround) { return 0; }

   } }

Thanks,

Tobias


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk