Boost logo

Boost :

From: Maurizio Vitale (mav_at_[hidden])
Date: 2007-05-05 11:38:18


Eric Niebler <eric_at_[hidden]> writes:

> Maurizio, I didn't see this message the first time because for some
> reason, all your messages appear out of order on GMane. Is the clock on
> your computer wrong? Is it something you can fix?

Should be fixed now. I noticed the problem yesterday when I started backing up
to Amazon S3.

> Maurizio Vitale wrote:
>> I don't know if it is a bug or not, but I was surprised by the effect
>> of a seemingly minor code change.
>>
> <snip>
>> So I said to myself: let's get rid of all those operators and replace them with
>> a single templatized version, like:
>>
>> template <typename Expr>
>> struct my_expression : proto::extends<Expr, my_expression<Expr>, my_domain> {
>> typedef proto::extends<Expr, my_expression<Expr>, my_domain> base_type;
>>
>> my_expression (Expr const& expr = Expr()) : base_type (expr) {};
>>
>> using base_type::operator =;
>>
>> template<typename T>
>> operator T () const {
>> return static_cast<T>(proto::eval(*this, my_context<Expr> ()));
>> }
>> };
>
>
> OK, your expression wrapper has an implicit conversion to any type T.
> That is, IMO, a bad idea, but nevertheless, proto shouldn't stop you
> from doing that.

The full plan is to later limit to a set of user specified (builtin) types.

I cannot boost::enable_if the operator itself, but since I'll need a
number of transformations as part of eval (among those quantization
and overflow handling), I'll fail with as a meaningful error message
as possible somewhere in the pipe. At least this is what I hope.

So builtin_type v = expression should pass through the operator T() above,
but my_int v = expression should not. I hope this will work without ambiguities,
otherwise I'll clearly remove operator T () here.

Does the plan still sound bad?

> I think I have fixed the problem in CVS.

Thanks a lot.

> Incidentally, you were running into an ambiguous conversion deep in the
> guts of callable_context, which uses an implicit conversion to a hidden
> type to detect whether your context has an overload of operator() that
> accepts the current expression. The code now uses a less-preferred
> conversion, avoiding the ambiguity with yours.

I take this is the explanation why operator T() above had problems.

Best regards,

     Maurizio


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