Hi Petr,

Petr Mladek schrieb:
On Monday 14 November 2005 10:41, Stephan Bergmann wrote:

A solution that should work is to replace uses of

  getCppuType(static_cast< T * >(0));

with uses of

  getCppuType<T>();


That function call is handled at template instantiation time in a way
that its correct specialization is found, for any kind of T defined in
whatever namespace.  The only problem is that getCppuType<T>() has a
slightly different semantic than getCppuType(T const *), see the comment
in com/sun/star/uno/Type.h.  Filed
<http://www.openoffice.org/issues/show_bug.cgi?id=57855>.



I hope I understood what you said :-)

It seems that it is not necessary to use getCppuType<T>(); The problem is with getCppuType(T const *), in fact. I tried to define also this function as a template in com/sun/star/uno/Type.h:

template< typename T > inline const ::com::sun::star::uno::Type & SAL_CALL
getCppuType( const T* ) SAL_THROW( () );


This is far more invasive than the change Stephan proposed. Stephan's idea leaves all existing function declarations untouched and only changes the implementation of one function template (or of several - there may be other similarly affected function templates elsewhere).

Your proposal removes dozens of existing function signatures and instead introduces one function template. At least theoretically that change is highly incompatible. As all functions and templates involved are inline I am not sure how bad the practical impact is. Nevertheless that change would have to be considered very carefully wrt. its effect on backwards compatibility on all supported platforms.

Note that it was necessary to mark it as a template/specialization in any other location, even in the .hdl, .hpp files. It was enough to add the line:

template <>


Yes that is the crucial point. Without this the functions should be preferred, but only the template declaration is found - and for that declaration there is no general definition.

before each declaration/definition. The compiler was not able to link the final library otherwise. It seems that a template specialization or a function definition are different symbols from the compiler point of view.


Yes they are. They could even be overloaded, so that ::getCppuType(t) and ::getCppuType<>(t) are different calls.

Then the sources can be compiled. Even it is not necessary to use getCppuType<T> when the function is used.


Yes, but as mentioned your change is in some ways bigger.

You talked about the problem that is described in com/sun/star/uno/Type.h. I expect that it was this comment:


Yes.

--- cut ---
/** Gets the meta type of an IDL type. The difference between this function template (with a type parameter) and the overloaded getCppuType function with a single (dummy) parameter of a specific type is that this function template may not work for the UNO type "unsigned short" (sal_uInt16 in C++), while the overloaded one-parameter function may not work for the UNO type "char" (sal_Unicode in C++, which may have the same underlying C++ type as sal_uInt16 on certain platforms). @return type of the given IDL type @since UDK 3.2.0 */
template< typename T > inline const ::com::sun::star::uno::Type & SAL_CALL
getCppuType() SAL_THROW(());
--- cut ---


I expect that it means that sal_Unicode is represented with the same type as sal_uInt16 on some platforms, so the symbols are the same.

Yes. They are the same C++-types, at least on some platforms.

And they are different on some platforms, so we need two
implementations.

That isn't the reason. The problem is that in the language-neutral UNO type system, the (unicode) character type is different from any integer type. As binary UNO demand a UTF-16 representation of characters, you really need three distinct 16-bit types:
   <unicode character>
   <signed short integer>
   <unsigned short integer>

But on most platforms C and C++ only have two distinct 16-bit integral types - sal_Int16 and sal_uInt16. Thus you have to choose one of them to *also* represent sal_Unicode and for various reasons the unsigned one is the best choice here.

But then, when you encounter that type in a generic UNO-related context you have to decide which interpretation to choose - does this type stand for unsigned short or unicode character here.

Am I right or is there another problem? I still do not understand why
it works when the symbols are not derived from a template.


It is not about works vs. doesn't work. Both versions 'work'. But they work differently, so simply substituting one for the other in a template implementation will change behavior or an existing interface.

The (older) overloaded functions getCppuType(T const*) prefers the sal_uInt16 interpretation, i.e. the getCppuType(sal_uInt16 const*) overload returns the UNO type data for <unsigned short integer>. To get the type data for <unicode character> you need to call the special getCppuCharType() [or so; from memory] function.

But the (newer) function template has an explicit specialization to prefer the <character> interpretation. The main reason is probably that unsigned integer types are not fully supported in the UNO type system (iirc you can't specify them in idl), whereas character is a first class citizen.

Thus, if you change the implementation of template Any::Any<T> to use getCppuType<T>() instead of getCppuType((T*)0), then the meaning of

  sal_uInt16 val = 65; Any theAny(val);

changes. Before the change the value of theAny is the unsigned number 65, afterwards it is the character 'A'.

This could be fixed by providing an explicit specialization of Any::Any<sal_uInt16> (or, if that is difficult for some compiler, an overloaded Any(sal_uInt16) to preserve the old semantics.

Last thing. I improved our example to show what I spoke about. The function f is now declared as a template. It can be compiled with gcc-4.1 even when the specialization for NS::C is declared after the definition of the function g.


Yes. That is the property Stephan's proposal made use of as well. But he used an existing function template instead of replacing the existing functions by template specializations.

Ciao, Joerg


--
Joerg Barfurth              Sun Microsystems - Desktop - Hamburg
>>>>>>>>>>>>>>>>>> using std::disclaimer <<<<<<<<<<<<<<<<<<<<<<<
Software Engineer                         [EMAIL PROTECTED]
OpenOffice.org Configuration          http://util.openoffice.org


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to