|
Boost : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2000-09-04 05:54:38
> I agree that ref<> itself is not a cloning pointer, but from my
> perspective the role it can play overlaps strongly. So a clearer name
> would be a start.
I'm open to suggestions. :)
> And it's not always desirable: int + long is desirable, but int + string
> is always a pain. Customisability could be achieved through a template
> parameter that defined the relevant traits to use.
int + string would throw an exception in the scheme I had in mind, because
int + string doesn't compile in the statically typed case.
Let me elaborate. Consider any::operator+:
any const operator+(any const & a1, any const & a2)
{
return lookup_operator_plus(a1.type_info(), a2.type_info())(a1, a2);
}
This should look familiar - it is a double dispatch engine. Which is no
surprise, because any is a 'polymorphic' class. Its static type is 'any',
but its 'dynamic type' is that of the value last stored in it.
[Aside: unary operators would use a single virtual dispatch engine. Compare
this to ref<T>, which reuses the language facilities for single dispatch.]
A double dispatch engine needs to know about all the possible overloads;
this is implemented by registering the functions with it beforehand.
Now think about the number of registrations needed for the standard op+. :)
Worse, when you add an user-defined type like, for example, this one:
class udt
{
public:
operator int() const;
};
the number of registrations that the user is required to supply is similarly
big.
Cases like
int i;
std::string s;
s + (char)i;
also deserve a deeper look.
So I conclude that making any behave exactly like the statically-typed
values is very difficult.
Perhaps I misinterpreted your original intent, however.
-- Peter Dimov Multi Media Ltd.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk