Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2003-02-19 08:37:24


Eric Friedman wrote:
> Peter Dimov wrote:
[...]
>> template <class T, ...> T & extract(variant<...> & operand);
>> template <class T, ...> T const & extract(variant<...> const &
>> operand); template <class T, ...> T * extract(variant<...> *
>> operand);
>> template <class T, ...> T const * extract(variant<...> const *
>> operand);
>>
>> it's no longer ambiguous.
>
> I believe it is. The following (admittedly silly) example fails to
> compile under Comeau:
>
> // -- BEGIN CODE EXAMPLE --
> template <class T, class Extractable> T & extract(Extractable &
> operand); template <class T, class Extractable> T const &
> extract(Extractable const & operand);
>
> template <class T, class Extractable> T * extract(Extractable *
> operand); template <class T, class Extractable> T const *
> extract(Extractable const * operand);

This is not what I wrote above.

>> The other option is to support a dynamic_cast-style extract:
>>
>> T * p = extract<T*>(&var);
>> T & r = extract<T&>(var);
>>
>> but it would likely require partial ordering/specialization.
>
> I've thought about this, but I think it would introduce significant
> confusion among users.
>
> For instance:
>
> variant<char, char*> v;
> char& c = extract<char&>(v); // ok... check for and either throw or
> extract char
> char* c = extract<char*>(v); // check for and either return null or
> extract: char? or char*?

Compile-time error, pointer syntax needs a pointer to the variant,
consistent with dynamic_cast and any_cast:

char* c = extract<char*>(&v);

> Even though the statement is well-defined (extract char) under your
> proposed syntax, I imagine many nonetheless would read the second
> line as extraction of char* from v. (While in fact it would extract
> char from v.)

Yes, it's possible to misread it.


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