Faking a non-pure function as pure
    Nordlöw 
    per.nordlow at gmail.com
       
    Fri Feb 16 17:58:18 UTC 2018
    
    
  
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);
}
    
    
More information about the Digitalmars-d-learn
mailing list