I'm struggling with my definition of assumePure that should make a non-pure function `f` callable as pure `pureF`.

I've copied the definition of assumePure from the Phobos docs at

https://dlang.org/phobos/std_traits.html#SetFunctionAttributes

and managed to define pureF using it but I cannot call `pureF` as either

    auto x = (*pureF)(42);
    auto x = pureF(42);

How do I do that?

import std.traits : isFunctionPointer, isDelegate, functionAttributes, FunctionAttribute, SetFunctionAttributes, functionLinkage;

/** Return `T` assumed to be `pure`.
Copied from https://dlang.org/phobos/std_traits.html#SetFunctionAttributes.
    */
auto assumePure(T)(T t)
    if (isFunctionPointer!T || isDelegate!T)
{
    enum attrs = functionAttributes!T | FunctionAttribute.pure_;
return cast(SetFunctionAttributes!(T, functionLinkage!T, attrs)) t;
}

int f(int x)
{
    return x + 1;
}

void g() pure
{
    static assert(!__traits(compiles, { auto x = f(42); }));
    alias pureF = assumePure!(typeof(&f));
    // TODO: how do I call pureF?
    // auto x = (*pureF)(42);
    // auto x = pureF(42);
}

Reply via email to