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