Using typedefed types as covariant return types

Stewart Gordon smjg at iname.com
Thu Feb 8 05:09:00 PST 2007


Bill Baxter Wrote:

> Rick Mann wrote:
>> I didn't get any responses in D.learn for this question, so I 
>> decided maybe it was advanced enough for this group.
>> 
>> I was hoping I could do this:
>> 
>> typedef void* CFTypeRef;
>> typedef CFTypeRef CFStringRef;
<snip>
>> From what I gather in the docs, CFStringRef is derived from 
>> CFTypeRef, so this should be acceptable.  Am I missing something?
> 
> That's not the message I get from reading the docs.  What I see:
> "Strong types are semantically a distinct type to the type checking 
> system, for function overloading, and for the debugger."
> (http://www.digitalmars.com/d/declaration.html)

Are you taking this to mean distinct from each other or distinct from their underlying types?  If the latter, this is much the same a class being different from its base class.

> Basically CFStringRef becomes something completely new and 
> different from CTypeRef as far as the compiler is concerned.

What are you reading that makes you think it's _completely_ different?  This compiles:

----------
typedef void* CFTypeRef;
typedef CFTypeRef CFStringRef;

void func(CFTypeRef p) {}

void main() {
    CFStringRef s;
    func(s);
}
----------

> What are you reading that makes you think CFStringRef is "derived" 
> from CFTypeRef?

Probably that typedefs implicitly convert to their underlying types.  Moreover, typedefs behave in a number of respects very similarly to enums, for which the notation

    enum Enum : int

suggests type derivation as with classes.

Stewart.



More information about the Digitalmars-d mailing list