How to assign a delegate to a var ?

bioinfornatics via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jun 3 05:57:08 PDT 2014


On Tuesday, 3 June 2014 at 12:27:45 UTC, bioinfornatics wrote:
> On Monday, 2 June 2014 at 23:27:03 UTC, Meta wrote:
>> On Monday, 2 June 2014 at 22:18:39 UTC, bioinfornatics wrote:
>>> Hi,
>>>
>>> I would like store the delegate to another var but when i try 
>>> i
>>> get:
>>>
>>>
>>> testTraitsWithDelegate.d(13): Error: expression template
>>> __lambda2 is void and has no value
>>>
>>> I do not want to run it only to save the «function» somewhere.
>>>
>>>
>>> ----------- CODE ------------
>>> import std.stdio;
>>> import std.typecons : Tuple;
>>>
>>> struct attribute( alias Pred )
>>> {
>>>    alias Predicate = Pred;
>>> }
>>>
>>>
>>>
>>> struct Data
>>> {
>>>    @attribute!( (a) => a == 42 )
>>>    int x;
>>> }
>>>
>>>
>>>
>>> void main()
>>> {
>>>
>>>    bool delegate( int ) tmp;
>>>
>>>    pragma( msg, __traits(getAttributes, Data.x)[0].Predicate( 
>>> 42
>>> ) );
>>>
>>>    tmp = __traits(getAttributes, Data.x)[0].Predicate;
>>> }
>>> ----------- END CODE ------------
>>
>> The problem is that you're missing the type of a in "(a) => a 
>> == 42". Without the type, it's actually a template lambda, not 
>> a lambda function. Try changing it to "(int a) => a == 42".
>> auto
>
> with this i got an error even if i do public alias Predicate in
> struct attribute:
> Error: struct testTraitsWithDelegate.attribute!(function (int a)
> => a == 42).attribute member __lambda2 is not accessible
>
> and i fail to do same with
>
> struct attribute
> {
>    public:
>      static bool delegate( int ) Predicate;
> }




To have same code

------------- code -----------
import std.stdio;
import std.typecons : Tuple;
//~ import std.functional : toDelegate;
//~ struct attribute( alias Pred )
//~ {
//~     public:
//~     alias Predicate = Pred;
//~ }

struct attribute
{
     public bool delegate( int ) predicate;
     public this(  bool delegate( int ) pred )
     {
         predicate = pred;
     }
}

struct Data
{
     @attribute( (int a) => a == 42 )
     int x;
}



void main()
{

     bool delegate( int ) tmp;

     pragma( msg, __traits(getAttributes, Data.x)[0] );
     pragma( msg, __traits(getAttributes, Data.x)[0].predicate( 42 
) );

     pragma( msg, __traits(getAttributes, 
Data.x)[0].predicate.stringof );
     tmp = __traits(getAttributes, Data.x)[0].predicate;
     writeln( tmp(42 ) );
     //~tmp = toDelegate(__traits(getAttributes, 
Data.x)[0].Predicate);
}
----------------------------------




give at compile time this:

attribute(function (int a) => a == 42)
true
(attribute __ctmp1474;
  , __ctmp1474).this(function (int a) => a == 42).predicate


And segfault at run-time


More information about the Digitalmars-d-learn mailing list