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