May 27, 2013 Accepting delegates/functions in templates | ||||
|---|---|---|---|---|
| ||||
I'm trying to accept delegates or functions in a templated method.
My first try using "isDelegate!dg || isFunctionPointer!dg" did not work because isDelegate fails, although I'm not sure I understand exactly why:
void main()
{
int x;
static assert(isDelegate!(() { x = 4; }));
// Error: static assert ... is false
}
If I changed that example to use isSomeFunction it works correctly. But when I tried to use isSomeFunction in the proper context it fails to compile:
class A
{
void foo(alias dg)()
if(isSomeFunction!dg)
{
}
}
void main()
{
int x;
A a = new A;
a.foo!((int param) { x = 4;});
// error: cannot use local '__lambda1' as parameter to non-global
template foo(alias dg)() if (isSomeFunction!(dg))
}
Can anyone help me understand this?
| ||||
May 27, 2013 Re: Accepting delegates/functions in templates | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Luís Marques | On 05/27/2013 07:05 AM, "Luís Marques" <luismarques@gmail.com>" wrote:
> If I changed that example to use isSomeFunction it works correctly. But
> when I tried to use isSomeFunction in the proper context it fails to
> compile:
It is a red herring. The code fails to compile even without isSomeFunction.
import std.traits;
> class A
> {
> void foo(alias dg)()
> if(isSomeFunction!dg)
> {
> }
> }
>
> void main()
> {
> int x;
> A a = new A;
> a.foo!((int param) { x = 4;});
>
> // error: cannot use local '__lambda1' as parameter to non-global
> template foo(alias dg)() if (isSomeFunction!(dg))
> }
>
> Can anyone help me understand this?
It is an unsolved technical issue about delegates' currently not having sufficient number of context pointers:
http://d.puremagic.com/issues/show_bug.cgi?id=5710
Ali
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply