conversion operators for UNO

Stephan Bergmann sbergman at redhat.com
Thu Apr 25 04:58:05 PDT 2013


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





More information about the LibreOffice mailing list