digitalmars.D.learn - std.traits.ReturnType b0rking on function pointer.
- Daniel Keep (22/22) Jan 17 2007 Hey there, I'm having problems with getting the return type of a
- Kirk McDonald (12/42) Jan 17 2007 ReturnType has two forms: One which is intended to operate on a function...
- Daniel Keep (21/65) Jan 17 2007 template SDL_Refcall(alias tFn)
- Kirk McDonald (18/89) Jan 17 2007 I have two thoughts:
- Daniel Keep (9/103) Jan 17 2007 Well, since I'm using Derelict, there isn't a huge amount I can do...
Hey there, I'm having problems with getting the return type of a function pointer. Basically, I want to do this: template SDL_SafeCall(alias tFn) { ReturnType!(SDL_SetVideoMode) SDL_SafeCall(...) { ... } } SDL_SafeCall!(SDL_SetVideoMode)(...); where SDL_SetVideoMode is declared like so (yes, it's DerelictSDL): typedef SDL_Surface* function(int,int,int,Uint32) pfSDL_SetVideoMode; pfSDL_SetVideoMode SDL_SetVideoMode; When I try to compile my code, I get the following errors: C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): alias std.traits.ReturnType!(pfSDL_SetVideoMode).ReturnType recursive alias declaration C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): template instance std.traits.ReturnType!(pfSDL_SetVideoMode) error instantiating I've tried writing my own version, but that didn't do any better. Anyone have any ideas? -- Daniel
Jan 17 2007
Daniel Keep wrote:Hey there, I'm having problems with getting the return type of a function pointer. Basically, I want to do this: template SDL_SafeCall(alias tFn) { ReturnType!(SDL_SetVideoMode) SDL_SafeCall(...) { ... } } SDL_SafeCall!(SDL_SetVideoMode)(...); where SDL_SetVideoMode is declared like so (yes, it's DerelictSDL): typedef SDL_Surface* function(int,int,int,Uint32) pfSDL_SetVideoMode; pfSDL_SetVideoMode SDL_SetVideoMode; When I try to compile my code, I get the following errors: C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): alias std.traits.ReturnType!(pfSDL_SetVideoMode).ReturnType recursive alias declaration C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): template instance std.traits.ReturnType!(pfSDL_SetVideoMode) error instantiating I've tried writing my own version, but that didn't do any better. Anyone have any ideas? -- DanielReturnType has two forms: One which is intended to operate on a function pointer or delegate /type/, and one which is intended to operate on a function alias. SDL_SetVideoMode is a function pointer. You want to pass its /type/ to ReturnType. By passing it directly, it gets sent to the alias form of ReturnType, which confuses it greatly. Try this: ReturnType!(typeof(SDL_SetVideoMode)) -- Kirk McDonald Pyd: Wrapping Python with D http://pyd.dsource.org
Jan 17 2007
Kirk McDonald wrote:Daniel Keep wrote:template SDL_Refcall(alias tFn) { // line 57 ReturnType!(typeof(tFn)) SDL_Refcall(tArgs...)(tArgs args) { ReturnType!(typeof(tFn)) r = tFn(args); if( r is null ) throw new SDLException(tFn.nameof, 0); else return r; } } SDL_Refcall!(SDL_SetVideoMode)(...); No good. C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): alias std.traits.ReturnType!(pfSDL_SetVideoMode).ReturnType recursive alias declaration C:\Daniel\dmd\dmd\src\phobos\std\traits.d(58): template instance std.traits.ReturnType!(pfSDL_SetVideoMode) error instantiating src\engine\shared_sdl\shared_sdl.d(58): Error: ReturnType!(pfSDL_SetVideoMode) is used as a typeHey there, I'm having problems with getting the return type of a function pointer. Basically, I want to do this: template SDL_SafeCall(alias tFn) { ReturnType!(SDL_SetVideoMode) SDL_SafeCall(...) { ... } } SDL_SafeCall!(SDL_SetVideoMode)(...); where SDL_SetVideoMode is declared like so (yes, it's DerelictSDL): typedef SDL_Surface* function(int,int,int,Uint32) pfSDL_SetVideoMode; pfSDL_SetVideoMode SDL_SetVideoMode; When I try to compile my code, I get the following errors: C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): alias std.traits.ReturnType!(pfSDL_SetVideoMode).ReturnType recursive alias declaration C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): template instance std.traits.ReturnType!(pfSDL_SetVideoMode) error instantiating I've tried writing my own version, but that didn't do any better. Anyone have any ideas? -- DanielReturnType has two forms: One which is intended to operate on a function pointer or delegate /type/, and one which is intended to operate on a function alias. SDL_SetVideoMode is a function pointer. You want to pass its /type/ to ReturnType. By passing it directly, it gets sent to the alias form of ReturnType, which confuses it greatly. Try this: ReturnType!(typeof(SDL_SetVideoMode))
Jan 17 2007
Daniel Keep wrote:Kirk McDonald wrote:I have two thoughts: pfSDL_SetVideoMode is declared as a typedef. Maybe try it as an alias? ReturnType just uses the "return" TypeSpecialization in the IsExpression, which might get confused by typedefs. (I have not tested this.) Second, you are passing in a (global?) variable as a template alias parameter. While this is technically allowed, I have had nothing but grief doing that sort of thing. I suggest re-writing it as: ReturnType!(fn_t) SDL_Refcall(fn_t, tArgs ...) (fn_t fn, tArgs args) { // stuff... } And then calling it as a regular function template: SDL_Refcall(SDL_SetVideoMode, ...); -- Kirk McDonald Pyd: Wrapping Python with D http://pyd.dsource.orgDaniel Keep wrote:template SDL_Refcall(alias tFn) { // line 57 ReturnType!(typeof(tFn)) SDL_Refcall(tArgs...)(tArgs args) { ReturnType!(typeof(tFn)) r = tFn(args); if( r is null ) throw new SDLException(tFn.nameof, 0); else return r; } } SDL_Refcall!(SDL_SetVideoMode)(...); No good. C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): alias std.traits.ReturnType!(pfSDL_SetVideoMode).ReturnType recursive alias declaration C:\Daniel\dmd\dmd\src\phobos\std\traits.d(58): template instance std.traits.ReturnType!(pfSDL_SetVideoMode) error instantiating src\engine\shared_sdl\shared_sdl.d(58): Error: ReturnType!(pfSDL_SetVideoMode) is used as a typeHey there, I'm having problems with getting the return type of a function pointer. Basically, I want to do this: template SDL_SafeCall(alias tFn) { ReturnType!(SDL_SetVideoMode) SDL_SafeCall(...) { ... } } SDL_SafeCall!(SDL_SetVideoMode)(...); where SDL_SetVideoMode is declared like so (yes, it's DerelictSDL): typedef SDL_Surface* function(int,int,int,Uint32) pfSDL_SetVideoMode; pfSDL_SetVideoMode SDL_SetVideoMode; When I try to compile my code, I get the following errors: C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): alias std.traits.ReturnType!(pfSDL_SetVideoMode).ReturnType recursive alias declaration C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): template instance std.traits.ReturnType!(pfSDL_SetVideoMode) error instantiating I've tried writing my own version, but that didn't do any better. Anyone have any ideas? -- DanielReturnType has two forms: One which is intended to operate on a function pointer or delegate /type/, and one which is intended to operate on a function alias. SDL_SetVideoMode is a function pointer. You want to pass its /type/ to ReturnType. By passing it directly, it gets sent to the alias form of ReturnType, which confuses it greatly. Try this: ReturnType!(typeof(SDL_SetVideoMode))
Jan 17 2007
Kirk McDonald wrote:Daniel Keep wrote:Well, since I'm using Derelict, there isn't a huge amount I can do... ok; I *could* go and change all instances of 'typedef' to 'alias'... might actually do that and see what happens (but I'd prefer to stick to an unmodified version if at all possible).Kirk McDonald wrote:I have two thoughts: pfSDL_SetVideoMode is declared as a typedef. Maybe try it as an alias? ReturnType just uses the "return" TypeSpecialization in the IsExpression, which might get confused by typedefs. (I have not tested this.)Daniel Keep wrote:template SDL_Refcall(alias tFn) { // line 57 ReturnType!(typeof(tFn)) SDL_Refcall(tArgs...)(tArgs args) { ReturnType!(typeof(tFn)) r = tFn(args); if( r is null ) throw new SDLException(tFn.nameof, 0); else return r; } } SDL_Refcall!(SDL_SetVideoMode)(...); No good. C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): alias std.traits.ReturnType!(pfSDL_SetVideoMode).ReturnType recursive alias declaration C:\Daniel\dmd\dmd\src\phobos\std\traits.d(58): template instance std.traits.ReturnType!(pfSDL_SetVideoMode) error instantiating src\engine\shared_sdl\shared_sdl.d(58): Error: ReturnType!(pfSDL_SetVideoMode) is used as a typeHey there, I'm having problems with getting the return type of a function pointer. Basically, I want to do this: template SDL_SafeCall(alias tFn) { ReturnType!(SDL_SetVideoMode) SDL_SafeCall(...) { ... } } SDL_SafeCall!(SDL_SetVideoMode)(...); where SDL_SetVideoMode is declared like so (yes, it's DerelictSDL): typedef SDL_Surface* function(int,int,int,Uint32) pfSDL_SetVideoMode; pfSDL_SetVideoMode SDL_SetVideoMode; When I try to compile my code, I get the following errors: C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): alias std.traits.ReturnType!(pfSDL_SetVideoMode).ReturnType recursive alias declaration C:\Daniel\dmd\dmd\src\phobos\std\traits.d(34): template instance std.traits.ReturnType!(pfSDL_SetVideoMode) error instantiating I've tried writing my own version, but that didn't do any better. Anyone have any ideas? -- DanielReturnType has two forms: One which is intended to operate on a function pointer or delegate /type/, and one which is intended to operate on a function alias. SDL_SetVideoMode is a function pointer. You want to pass its /type/ to ReturnType. By passing it directly, it gets sent to the alias form of ReturnType, which confuses it greatly. Try this: ReturnType!(typeof(SDL_SetVideoMode))Second, you are passing in a (global?) variable as a template alias parameter. While this is technically allowed, I have had nothing but grief doing that sort of thing. I suggest re-writing it as: ReturnType!(fn_t) SDL_Refcall(fn_t, tArgs ...) (fn_t fn, tArgs args) { // stuff... } And then calling it as a regular function template: SDL_Refcall(SDL_SetVideoMode, ...);Aww... but the old way was so much purtier... Anyway, I'll give these a try once I've sufficiently woken up, and let you know how it goes. -- Daniel
Jan 17 2007