Thread overview
Passing around a list of differently typed functions
Jun 23, 2014
Evan Davis
Jun 23, 2014
Tobias Pankrath
Jun 23, 2014
FreeSlave
Jun 23, 2014
Ali Çehreli
Jun 23, 2014
Bienlein
Jun 23, 2014
Alix Pexton
June 23, 2014
As the subject says, I would like to pass around an array of functions. The trick is, that the functions have different type signatures. Is there a way to put the two functions

int foo(int a, int b);
bool bar(bool a, bool b);

into one array, that I can pass around and cast as necessary?

Thanks, Evan
June 23, 2014
On Monday, 23 June 2014 at 01:16:49 UTC, Evan Davis wrote:
> As the subject says, I would like to pass around an array of functions. The trick is, that the functions have different type signatures. Is there a way to put the two functions
>
> int foo(int a, int b);
> bool bar(bool a, bool b);
>
> into one array, that I can pass around and cast as necessary?
>
> Thanks, Evan

Use void* as a common type or use std.variant.
June 23, 2014
On Monday, 23 June 2014 at 01:16:49 UTC, Evan Davis wrote:
> As the subject says, I would like to pass around an array of functions. The trick is, that the functions have different type signatures. Is there a way to put the two functions
>
> int foo(int a, int b);
> bool bar(bool a, bool b);
>
> into one array, that I can pass around and cast as necessary?
>
> Thanks, Evan

You can pass them as pointers, for example cast to void*. But you still need correct signature to cast pointer to actual type before call function.
June 23, 2014
On Monday, 23 June 2014 at 01:16:49 UTC, Evan Davis wrote:
> As the subject says, I would like to pass around an array of functions. The trick is, that the functions have different type signatures. Is there a way to put the two functions
>
> int foo(int a, int b);
> bool bar(bool a, bool b);
>
> into one array, that I can pass around and cast as necessary?
>
> Thanks, Evan

Have functions in the array without parpameters that call the function with the applicable parameters, e.g. int foo(int a, int b) or bool bar(bool a, bool b). That doesn't address the problem of the different return types (int and bool). So change the return type to void and return the value as an inout parameter.
June 23, 2014
On 23/06/2014 8:19 AM, Bienlein wrote:
> On Monday, 23 June 2014 at 01:16:49 UTC, Evan Davis wrote:
>> As the subject says, I would like to pass around an array of
>> functions. The trick is, that the functions have different type
>> signatures. Is there a way to put the two functions
>>
>> int foo(int a, int b);
>> bool bar(bool a, bool b);
>>
>> into one array, that I can pass around and cast as necessary?
>>
>> Thanks, Evan
>
> Have functions in the array without parpameters that call the function
> with the applicable parameters, e.g. int foo(int a, int b) or bool
> bar(bool a, bool b). That doesn't address the problem of the different
> return types (int and bool). So change the return type to void and
> return the value as an inout parameter.

You could convert your functions to return via an out parameter (either manually or with template magic) then have an array of same-signatured closures that can call any function.

A...
June 23, 2014
On 06/22/2014 11:32 PM, FreeSlave wrote:> On Monday, 23 June 2014 at 01:16:49 UTC, Evan Davis wrote:
>> As the subject says, I would like to pass around an array of
>> functions. The trick is, that the functions have different type
>> signatures. Is there a way to put the two functions
>>
>> int foo(int a, int b);
>> bool bar(bool a, bool b);
>>
>> into one array, that I can pass around and cast as necessary?
>>
>> Thanks, Evan
>
> You can pass them as pointers, for example cast to void*. But you still
> need correct signature to cast pointer to actual type before call function.

In C and C++, void* is for data pointers only. As function pointers are a different kind of beast, casting to and from void* is undefined behavior. (Note: It works on all common platforms.)

I wonder whether D has any decision on that.

Ali

June 23, 2014
On Mon, 23 Jun 2014 14:30:12 -0400, Ali Çehreli <acehreli@yahoo.com> wrote:

> On 06/22/2014 11:32 PM, FreeSlave wrote:> On Monday, 23 June 2014 at 01:16:49 UTC, Evan Davis wrote:
>  >> As the subject says, I would like to pass around an array of
>  >> functions. The trick is, that the functions have different type
>  >> signatures. Is there a way to put the two functions
>  >>
>  >> int foo(int a, int b);
>  >> bool bar(bool a, bool b);
>  >>
>  >> into one array, that I can pass around and cast as necessary?
>  >>
>  >> Thanks, Evan
>  >
>  > You can pass them as pointers, for example cast to void*. But you still
>  > need correct signature to cast pointer to actual type before call function.
>
> In C and C++, void* is for data pointers only. As function pointers are a different kind of beast, casting to and from void* is undefined behavior. (Note: It works on all common platforms.)

Wow, really? That is strange.

> I wonder whether D has any decision on that.

I would hope it's defined. A pointer is a pointer.

-Steve