How do I invoke the member function in a reliable way? Given obj
of the type of the object, I used mixin("obj.", __traits(identifier, memberFunc), "(params)")
, but that has issues, among probably others, definitely with visibility. (The member function alias is a template parameter.)
Thread overview | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
May 02, 2023 Given an object, how to call an alias to a member function on it? | ||||
---|---|---|---|---|
| ||||
May 02, 2023 Re: Given an object, how to call an alias to a member function on it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Quirin Schroll | On 02.05.23 14:52, Quirin Schroll wrote:
> How do I invoke the member function in a reliable way? Given `obj` of the type of the object, I used `mixin("obj.", __traits(identifier, memberFunc), "(params)")`, but that has issues, among probably others, definitely with visibility. (The member function alias is a template parameter.)
Construct a delegate from the alias and the object, and call that delegate:
----
class C
{
int field = 42;
void method() { import std.stdio; writeln(field); }
}
void fun(alias method)(C c)
{
void delegate() dg;
dg.funcptr = &method;
dg.ptr = cast(void*) c;
dg();
}
void main()
{
fun!(C.method)(new C); /* prints "42" */
}
----
|
May 02, 2023 Re: Given an object, how to call an alias to a member function on it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Quirin Schroll | On 5/2/23 8:52 AM, Quirin Schroll wrote: >How do I invoke the member function in a reliable way? Given Isn't that what https://dlang.org/spec/traits.html#child -Steve |
May 03, 2023 Re: Given an object, how to call an alias to a member function on it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to ag0aep6g | On Tuesday, 2 May 2023 at 13:06:41 UTC, ag0aep6g wrote:
> void fun(alias method)(C c)
> {
> void delegate() dg;
> dg.funcptr = &method;
> dg.ptr = cast(void*) c;
> dg();
> }
This also works:
void fun(alias method)(C c)
{
void delegate() dg = &c.method;
dg();
}
|
May 03, 2023 Re: Given an object, how to call an alias to a member function on it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nick Treleaven | On 03.05.23 13:13, Nick Treleaven wrote:
> On Tuesday, 2 May 2023 at 13:06:41 UTC, ag0aep6g wrote:
>> void fun(alias method)(C c)
>> {
>> void delegate() dg;
>> dg.funcptr = &method;
>> dg.ptr = cast(void*) c;
>> dg();
>> }
>
> This also works:
>
> void fun(alias method)(C c)
> {
> void delegate() dg = &c.method;
> dg();
> }
>
No, it doesn't. You're not using the alias. You're just accessing `c.method` directly. If the actual method weren't called "method", you'd get an error.
|
May 03, 2023 Re: Given an object, how to call an alias to a member function on it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Tuesday, 2 May 2023 at 13:57:23 UTC, Steven Schveighoffer wrote:
> Isn't that what `__traits(child)` is for?
>
> https://dlang.org/spec/traits.html#child
Yes, __traits(child, object, method_alias)(args) is the way to do it.
|
May 03, 2023 Re: Given an object, how to call an alias to a member function on it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to ag0aep6g | On Wednesday, 3 May 2023 at 11:26:00 UTC, ag0aep6g wrote:
> On 03.05.23 13:13, Nick Treleaven wrote:
>> void fun(alias method)(C c)
>> {
>> void delegate() dg = &c.method;
>> dg();
>> }
>>
>
> No, it doesn't. You're not using the alias. You're just accessing `c.method` directly. If the actual method weren't called "method", you'd get an error.
Sorry, you're right.
|
May 04, 2023 Re: Given an object, how to call an alias to a member function on it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D Ruppe | On Wednesday, 3 May 2023 at 11:38:46 UTC, Adam D Ruppe wrote: >On Tuesday, 2 May 2023 at 13:57:23 UTC, Steven Schveighoffer wrote: >Isn't that what Yes, This doesn’t work, but a slight modification does the trick:
Thanks for making me aware of |