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