Thread overview
comparing typedefed type to null
Mar 02, 2007
Rick Mann
Mar 02, 2007
mike
March 02, 2007
In writing code against the Mac OS X Carbon API, I often have a need to do this:

struct __Foo {};
typedef Foo*   FooRef;
typedef FooRef     BarRef;

{
  BarRef br = ...;
  FooRef fr = ...;
  if (br == null)  {} // complain
  if (fr == null) {} ok

GDC 0.22/DMD 1.004 complains about the comparison to br: "Error: incompatible types for ((br) == (null)): 'BarRef' and 'void*'

I can avoid it by aliasing BarRef instead of typedefing it, but I have the need to allow a BarRef to be passed to FooRef parameters, but not the other way around. The typedef gives me that.
March 02, 2007
Am 02.03.2007, 01:40 Uhr, schrieb Rick Mann <rmann-d-lang@latencyzero.com>:

> In writing code against the Mac OS X Carbon API, I often have a need to do this:
>
> struct __Foo {};
> typedef Foo*   FooRef;
> typedef FooRef     BarRef;
>
> {
>   BarRef br = ...;
>   FooRef fr = ...;
>   if (br == null)  {} // complain
>   if (fr == null) {} ok
>
> GDC 0.22/DMD 1.004 complains about the comparison to br: "Error: incompatible types for ((br) == (null)): 'BarRef' and 'void*'
>
> I can avoid it by aliasing BarRef instead of typedefing it, but I have the need to allow a BarRef to be passed to FooRef parameters, but not the other way around. The typedef gives me that.

You should always use the "is" operator to check for null:

' if (br is null) { ... }

-Mike

-- 
Erstellt mit Operas revolutionärem E-Mail-Modul: http://www.opera.com/mail/
March 02, 2007
mike wrote:

> You should always use the "is" operator to check for null:
> 
> ' if (br is null) { ... }

Using == is perfectly valid for pointers (such as those).

--anders
March 02, 2007
"Rick Mann" <rmann-d-lang@latencyzero.com> wrote in message news:es7rp3$153q$1@digitalmars.com...
> In writing code against the Mac OS X Carbon API, I often have a need to do this:
>
> struct __Foo {};
> typedef Foo*   FooRef;
> typedef FooRef     BarRef;
>
> {
>  BarRef br = ...;
>  FooRef fr = ...;
>  if (br == null)  {} // complain
>  if (fr == null) {} ok
>
> GDC 0.22/DMD 1.004 complains about the comparison to br: "Error: incompatible types for ((br) == (null)): 'BarRef' and 'void*'
>
> I can avoid it by aliasing BarRef instead of typedefing it, but I have the need to allow a BarRef to be passed to FooRef parameters, but not the other way around. The typedef gives me that.

template realType(T)
{
    static if(is(T U == typedef))
        alias realType!(U) realType;
    else
        alias T realType;
}

bool isNull(T)(T val)
{
    return (cast(realType!(T))val is null);
}

void main()
{
    BarRef br;
    FooRef fr;

    if (isNull(br)) {}
}



:S

There's got to be a better way..