digitalmars.D.learn - Function overloading question
- =?UTF-8?B?TcOhcmNpbyBGYXVzdGlubw==?= (20/20) Aug 26 2007 Hi,
- Daniel Keep (11/38) Aug 26 2007 I can't think why. I mean, you've put a specific kind of pointer into a
- =?UTF-8?B?TcOhcmNpbyBGYXVzdGlubw==?= (3/16) Aug 26 2007 Thanks for the answer. I wasn't actually coding anything like that, it's...
- Kirk McDonald (15/35) Aug 26 2007 void foo(int) {}
- =?UTF-8?B?TcOhcmNpbyBGYXVzdGlubw==?= (2/17) Aug 27 2007 Thanks!
Hi, Shouldn't the compiler (DMD v2.003) issue at least a warning when I do this? //--------------------------------------------------------- import std.stdio; void f(bool b, string which) { writefln("bool == ", which); } void f(char c, string which) { writefln("char == ", which); } void main() { // Here: void* fp = &f; // Which one will be called? (cast(void function(bool, string)) fp)(0, "bool"); (cast(void function(char, string)) fp)(0, "char"); } //--------------------------------------------------------- Thanks,
Aug 26 2007
Márcio Faustino wrote:Hi, Shouldn't the compiler (DMD v2.003) issue at least a warning when I do this? //--------------------------------------------------------- import std.stdio; void f(bool b, string which) { writefln("bool == ", which); } void f(char c, string which) { writefln("char == ", which); } void main() { // Here: void* fp = &f; // Which one will be called? (cast(void function(bool, string)) fp)(0, "bool"); (cast(void function(char, string)) fp)(0, "char"); } //--------------------------------------------------------- Thanks,I can't think why. I mean, you've put a specific kind of pointer into a void* (that's perfectly fine). Because f is overloaded, and you haven't specified which overload you want, I believe it will take the first one, lexically speaking. You've then gone and brute-force cast the pointer to another type. The moment you involve cast, you're taking on responsibility for not doing anything stupid. Doing things like getting a pointer to an overloaded function is a bit of a wart at the moment. Hopefully, polysemous values will help. -- Daniel
Aug 26 2007
Daniel Keep wrote:I can't think why. I mean, you've put a specific kind of pointer into a void* (that's perfectly fine). Because f is overloaded, and you haven't specified which overload you want, I believe it will take the first one, lexically speaking. You've then gone and brute-force cast the pointer to another type. The moment you involve cast, you're taking on responsibility for not doing anything stupid. Doing things like getting a pointer to an overloaded function is a bit of a wart at the moment. Hopefully, polysemous values will help. -- DanielThanks for the answer. I wasn't actually coding anything like that, it's just that I was wondering how to take the address of an overloaded function.
Aug 26 2007
Márcio Faustino wrote:Daniel Keep wrote:void foo(int) {} void foo(double) {} There are two ways: void function(int) fn1 = &foo; void function(double) fn2 = &foo; These will each get the proper overloads. Alternately: auto fn3 = cast(void function(int)) &foo; auto fn4 = cast(void function(double)) &foo; This will also work. -- Kirk McDonald http://kirkmcdonald.blogspot.com Pyd: Connecting D and Python http://pyd.dsource.orgI can't think why. I mean, you've put a specific kind of pointer into a void* (that's perfectly fine). Because f is overloaded, and you haven't specified which overload you want, I believe it will take the first one, lexically speaking. You've then gone and brute-force cast the pointer to another type. The moment you involve cast, you're taking on responsibility for not doing anything stupid. Doing things like getting a pointer to an overloaded function is a bit of a wart at the moment. Hopefully, polysemous values will help. -- DanielThanks for the answer. I wasn't actually coding anything like that, it's just that I was wondering how to take the address of an overloaded function.
Aug 26 2007
Kirk McDonald wrote:void foo(int) {} void foo(double) {} There are two ways: void function(int) fn1 = &foo; void function(double) fn2 = &foo; These will each get the proper overloads. Alternately: auto fn3 = cast(void function(int)) &foo; auto fn4 = cast(void function(double)) &foo; This will also work.Thanks!
Aug 27 2007