Address of overloaded functions

Artur Skawina art.08.09 at gmail.com
Wed Jul 3 09:07:07 PDT 2013


On 07/03/13 17:43, H. S. Teoh wrote:
> On Wed, Jul 03, 2013 at 05:41:25PM +0200, Artur Skawina wrote:
>> On 07/03/13 17:27, H. S. Teoh wrote:
>>> On Wed, Jul 03, 2013 at 05:15:48PM +0200, John Colvin wrote:
>>>> On Wednesday, 3 July 2013 at 15:03:46 UTC, Artur Skawina wrote:
>>>>> On 07/03/13 16:52, John Colvin wrote:
>>>>>> Is there any way to take the address of any of an overloaded set
>>>>>> of functions?
>>>>>>
>>>>>> import std.stdio;
>>>>>>
>>>>>> void foo(int a){ writeln("overload int"); }
>>>>>> void foo(long b){ writeln("overload long"); }
>>>>>>
>>>>>> void main()
>>>>>> {
>>>>>>    auto b = &foo; //ambiguous => error
>>>>>>    b(2); //valid for either overload
>>>>>> }
>>>>>
>>>>>    void function(long) b = &foo;
>>>>>
>>>>> artur
>>>>
>>>> Thanks, that works
>>>
>>> This is interesting. How does C++ handle this? (Or does it?)
>>
>> The same - the context determines which overload is chosen, and 
>> ambiguity is an error.
> 
> Oh, so it tells the difference by whether you write
> 
> 	void (*p)(int) = foo;
> 
> or
> 
> 	void (*p)(long) = foo;
> 
> ?

Yep. Things like

   void c(void (*fp)(long), long a) { fp(a); }
   c(foo, 2);

work as expected too.

> I guess that makes sense.

The context dependence isn't ideal, but what's the alternative?...

artur


More information about the Digitalmars-d-learn mailing list