On 04/25/2013 10:35 AM, Noel Grandin wrote:
I would like to discuss the addition of conversion operators for UNO. Let me start with an example. If we have IDL that looks like: interface A {} interface B : A {} Then we typically have C++ code that looks like void foo(Reference<A> a) void bar() { Reference<B> b = .... methodThatTakesA( Reference<A>(b, UNO_QUERY_THROW) ); } I want to change things so that I can write: void bar() { Reference<B> b = .... methodThatTakesA( b ); } and have the code automagically perform the B to A conversion Is there some reason this would not be desirable? (I'll leave the question as to whether or not is implementable for later :-)
This has been discussed before more than once, but I tend to forget whether it has never gone past discussion stage because the implementation would be slightly tricky (using SFNIAE to restrict implicit conversions from Reference<B> to Reference<A> to cases where B is derived from A) or because there was some fundamental flaw with it.
Implementing it via a direct upcast (rather than queryInterface) would fail for ambiguities resulting from MI (like C deriving from B1 and B2, each deriving from A, and trying to convert Reference<C> to Reference<A>), and then there's the special case of requiring explicit queryInterface(XInterface) for UNO object equality testing, but apart from that I cannot think of any problems off the top of my head.
Stephan