Is there any way to differentiate between a type and an alias?
Rene Zwanenburg via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun May 25 15:13:17 PDT 2014
On Sunday, 25 May 2014 at 14:40:06 UTC, Steven Schveighoffer
wrote:
> On Sun, 25 May 2014 04:04:09 -0700, Rene Zwanenburg
> <renezwanenburg at gmail.com> wrote:
>
>> Given
>>
>> alias GLenum = uint;
>> void glSomeFunction(GLenum, uint);
>>
>> Now, is there some way to differentiate between GLenum and
>> uint when using ParameterTypeTuple!glSomeFunction?
>>
>> I'm writing a function which shows the arguments a GL function
>> was called with when an error occurs. The GLenum needs to be
>> printed as a stringified version of the constant's name, while
>> the uint is just an uint.
>
> An alias is simply another name for the same thing. There is no
> type difference.
>
> You may be able to do some template trickery with template
> aliases to detect when an alias is used. But I'd recommend
> using enum instead of alias:
>
> enum GLenum : uint { constant = value}
>
> This creates a genuine new type, and also gives you a place to
> put constants. However, it's not implicitly castable from uint,
> so it has some drawbacks. You can cast back to uint implicitly
> though.
>
> There is also a library typedef mechanism (in std.typecons
> perhaps?), you can look into that. It should have the same
> limitations as enum.
>
> -Steve
I'm using Derelict as OpenGL binding, so I can't change the API.
Derelict has chosen not to use enum so any C code sample can be
used as-is. The downside is that it makes writing idiomatic D
code a bit harder. For a D enum I could get the string
representation using to!string, now I have to do some compile
time magic.
It's not really an issue though. I was wondering if there was a
simple solution, but I'll just print both the uint value and
string representation if any. Good enough for me :)
More information about the Digitalmars-d-learn
mailing list