Figuring out the returntype opDipatch

TheFlyingFiddle theflyingfiddle at gmail.com
Thu Nov 14 12:39:33 PST 2013


On Sunday, 3 November 2013 at 10:48:45 UTC, Jacob Carlborg wrote:
> On 2013-11-03 03:15, TheFlyingFiddle wrote:
>
>> In the IReflectionable interface:
>>
>> interface IReflectionable
>> {
>>     final P funcPtr(P)(string fun) if (is(P == delegate))
>>     {
>>         //Using mangeling for overloads and type safety
>>     auto ptr = delPtr_impl(mangle!P(fun));
>>
>>     P del;
>>     del.ptr = cast(typeof(del.ptr))ptr[0];
>>     del.funcptr = cast(typeof(del.funcptr))ptr[1];
>>     return del;
>>     }
>>
>>     final P funcPtr(P)(string fun) if (is(P == function))
>>     {
>>         //Using mangeling for overloads and type safety
>>     auto ptr = funcPtr_impl(mangle!(P)(fun));
>>     return cast(P)ptr;
>>     }
>>
>>     final ?? opDispatch(string name, Params...)(Params params)
>>     {
>>        alias ?? delegate(Params) del_type;
>>        auto del = funcPtr!(del_type)(name);
>>
>>        static if(?? == void)
>>           del(params);
>>        else
>>           return del(params);
>>     }
>>
>>     protected Tuple!(void*, void*) delPtr_impl(string s);
>>     protected void* funcPtr_impl(string s);
>> }
>>
>> What i'm interested in is determining what type ?? should be. 
>> Variant
>> works but if possible i would like to avoid it. This would 
>> require me to
>> know about the code at the invokation site. (So i'm guessing 
>> it might
>> not be possible)
>
> I have the same problem as well. I haven't figured out the best 
> way to solve this yet.

Might this be something you could solve using the DIP50 AST 
macros?

Something like


interface IRefectionable
{
    //I'm assuming you can use a macro as opDispatch
    macro opDispatch(string s, Params...)(Context context, 
Ast!(Params) ast)
    {
        //The name is sort of bad
        enum returnType = context.?? //Look at the stuff in the 
context to figure out what the returnType would be.

        return <|
    alias ?? delegate(Params) del_type;
        auto del = funcPtr!(del_type)(name);

        static if(?? == void)
           del(params);
        else
           return del(params);
    }
}

unittest
{
    IReflectionable refl = new Foo();

    refl.bar(1); //void is infered since not setting any value.
    int baz = refl.baz("Hello");
    auto baz2 = refl.baz("hello"); //Can't work.

}




More information about the Digitalmars-d-learn mailing list