digitalmars.D.learn - Problem with aliasing member function
Hello,
I can't compile this piece of code:
struct Object
{
void run(wstring ending, uint index)(int number)
{
}
}
void tester(alias callback, T)(int number, T object = null)
{
static if(is(T == typeof(null))) alias handler = callback;
else auto handler(wstring ending, uint index) =
object.callback!(ending, index);
handler!("rfv", 5)(word);
}
void main()
{
Object obj;
tester!(Object.run)(10, &obj);
}
Here in tester I want to alias a template method and call it on
object if this object isn't null. But I don't understand how to
do it.
How to solve the problem?
Aug 18 2019
On Sun, 18 Aug 2019 19:17:16 +0000, Andrey wrote:Here in tester I want to alias a template method and call it on object if this object isn't null. But I don't understand how to do it. How to solve the problem?I don't think you can alias an object method directly; three methods I know of: --- struct Struct { void run(int number) { import std.stdio; writeln("run ", number); } } // Pass the object itself. void func1(alias obj)(int number) if (isFunction!(obj.run)) { obj.run(number); } // Pass the object and the name of the method. void func2(alias obj, string method)(int number) if (__traits(compiles, "obj." ~ method ~ "(number);")) { mixin("obj." ~ method ~ "(number);"); } // Pass the method at runtime. void func3(void delegate(int) f, int number) { f(number); } void main() { Struct obj; func1!(obj)(1); func2!(obj, "run")(2); func3(&obj.run, 3); } --- Also, you don't want to name something "Object"; the base class is called Object -- the struct shadows it but you may run into some bug or confusion later. --Ryan
Aug 18 2019








rjframe <dlang ryanjframe.com>