On Monday, 22 May 2017 at 21:44:17 UTC, ag0aep6g wrote:
On 05/22/2017 11:04 AM, Alex wrote:
[...]

Not only is a template not an lvalue, it's not any kind of value at all. It doesn't have a type. You can't have a variable holding a template. You can't pass it as an argument.

But a template is a symbol. You can pass it in an alias parameter. So to pass dlg to C, you have to make C a template with an alias parameter, like A is.

Aha... ok, I see...


[...]
`A!dlg a;` works. Calling `fun` doesn't.

A.fun instantiates dlg, resulting in a delegate that should be able to access main's stuff. But it's not guaranteed that main is active when A.fun is called. You could have returned `a` from main before calling fun. For an actual delegate, a closure would be made in that case. But dlg isn't a delegate, it's a template. I guess it's not possible (or not feasible, or not implemented) to create a closure a template like this.

ok, I see the point, I think...


If you don't actually need dlg to access main's stuff, you can make it static. It's a function then and the delegate weirdness doesn't apply.


yeah... no :)
the function inside the main has to have access to the main stuff. Its the pointer inside C which could be static, if this would help. So long, I go for the enhanced second variant...

For another approach to your problem, maybe have a look at run-time variadic arguments:

https://dlang.org/spec/function.html#d_style_variadic_functions

With that kind of variadics, you're not dealing with a template. A (run-time) variadic delegate is an actual delegate, i.e. a value that can be passed around. But the variadic stuff is a bit weird to use, and probably affects performance.

Hm... You are probably right... and variadic functions do not really match the idea...

Reply via email to