Thread overview
Equivalent of C++ std::function
Jun 25, 2014
Yuushi
Jun 25, 2014
Mike Parker
Jun 25, 2014
Mike Parker
Jun 25, 2014
Yuushi
Jun 25, 2014
Olivier Pisano
Jun 25, 2014
Yuushi
Jun 25, 2014
Ali Çehreli
Jun 25, 2014
Ali Çehreli
June 25, 2014
I was wondering if D had something akin to std::function in C++.

Say I have some functions in an associative array, for example:

     auto mapping = ['!' : (string a) => toUpper!string(a), '^' : (string a) => capitalize!string(a)];

What I want to do is basically declare something like:

    function string(string) transform;
    if(<some condition>) {
         transform = mapping[<lookup>];
    }

In C++, this could be done by declaring:

     std::function<string(string)> transform;

Is there an equivalent D construct for this?
June 25, 2014
On 6/25/2014 10:10 AM, Yuushi wrote:
> I was wondering if D had something akin to std::function in C++.
>
> Say I have some functions in an associative array, for example:
>
>       auto mapping = ['!' : (string a) => toUpper!string(a), '^' :
> (string a) => capitalize!string(a)];
>
> What I want to do is basically declare something like:
>
>      function string(string) transform;
>      if(<some condition>) {
>           transform = mapping[<lookup>];
>      }
>
> In C++, this could be done by declaring:
>
>       std::function<string(string)> transform;
>
> Is there an equivalent D construct for this?

For function pointers (free functions or static class functions):

alias TransformFunc = string function( string );
TransformFunc transform;

if( foo ) transform = &func;

For delegates (lambdas or pointers to class methods or inner functions):

alias TransformDg = string delegate( string );
TransformDG transform;

if( foo ) transform = &bar.method;

---
This email is free from viruses and malware because avast! Antivirus protection is active.
http://www.avast.com

June 25, 2014
On 6/25/2014 10:45 AM, Mike Parker wrote:
> On 6/25/2014 10:10 AM, Yuushi wrote:
>> I was wondering if D had something akin to std::function in C++.
>>
>> Say I have some functions in an associative array, for example:
>>
>>       auto mapping = ['!' : (string a) => toUpper!string(a), '^' :
>> (string a) => capitalize!string(a)];
>>
>> What I want to do is basically declare something like:
>>
>>      function string(string) transform;
>>      if(<some condition>) {
>>           transform = mapping[<lookup>];
>>      }
>>
>> In C++, this could be done by declaring:
>>
>>       std::function<string(string)> transform;
>>
>> Is there an equivalent D construct for this?
>
> For function pointers (free functions or static class functions):
>
> alias TransformFunc = string function( string );
> TransformFunc transform;
>
> if( foo ) transform = &func;
>
> For delegates (lambdas or pointers to class methods or inner functions):
>
> alias TransformDg = string delegate( string );
> TransformDG transform;
>
> if( foo ) transform = &bar.method;
>

And in this case you want the latter:

TransformDg transform = mapping[ '!' ];


---
This email is free from viruses and malware because avast! Antivirus protection is active.
http://www.avast.com

June 25, 2014
On Wednesday, 25 June 2014 at 01:47:13 UTC, Mike Parker wrote:
> On 6/25/2014 10:45 AM, Mike Parker wrote:
>> On 6/25/2014 10:10 AM, Yuushi wrote:
>>> I was wondering if D had something akin to std::function in C++.
>>>
>>> Say I have some functions in an associative array, for example:
>>>
>>>      auto mapping = ['!' : (string a) => toUpper!string(a), '^' :
>>> (string a) => capitalize!string(a)];
>>>
>>> What I want to do is basically declare something like:
>>>
>>>     function string(string) transform;
>>>     if(<some condition>) {
>>>          transform = mapping[<lookup>];
>>>     }
>>>
>>> In C++, this could be done by declaring:
>>>
>>>      std::function<string(string)> transform;
>>>
>>> Is there an equivalent D construct for this?
>>
>> For function pointers (free functions or static class functions):
>>
>> alias TransformFunc = string function( string );
>> TransformFunc transform;
>>
>> if( foo ) transform = &func;
>>
>> For delegates (lambdas or pointers to class methods or inner functions):
>>
>> alias TransformDg = string delegate( string );
>> TransformDG transform;
>>
>> if( foo ) transform = &bar.method;
>>
>
> And in this case you want the latter:
>
> TransformDg transform = mapping[ '!' ];
>
>
> ---
> This email is free from viruses and malware because avast! Antivirus protection is active.
> http://www.avast.com

Thanks a ton - I guess I need to do a fair bit more reading about alias.
June 25, 2014
On Wednesday, 25 June 2014 at 03:33:15 UTC, Yuushi wrote:
>
> Thanks a ton - I guess I need to do a fair bit more reading about alias.

In this case, alias acts as typedef in C++. What is important here is the function pointers/delegates syntax.

June 25, 2014
On Wednesday, 25 June 2014 at 05:13:00 UTC, Olivier Pisano wrote:
> On Wednesday, 25 June 2014 at 03:33:15 UTC, Yuushi wrote:
>>
>> Thanks a ton - I guess I need to do a fair bit more reading about alias.
>
> In this case, alias acts as typedef in C++. What is important here is the function pointers/delegates syntax.

Yeah, I realised that when I went back and looked at what I'd tried:

     function string(string) transform;

which should have been:

    string function(string) transform;

which does work.

Thanks for the clarification.





June 25, 2014
On 06/24/2014 08:33 PM, Yuushi wrote:

> I guess I need to do a fair bit more reading about alias.

It is probably too basic for you but somebody else may find it useful:

 http://ddili.org/ders/d.en/lambda.html

Ali

June 25, 2014
On 06/24/2014 11:23 PM, Yuushi wrote:

> Yeah, I realised that when I went back and looked at what I'd tried:
>
>       function string(string) transform;

That gets me all the time! :-/ That is the long version of the function literal syntax:

    auto f = function string(string s) { return "hello"; };

>
> which should have been:
>
>      string function(string) transform;
>
> which does work.
>
> Thanks for the clarification.

Ali