isCallableCTFE trait to test whether an expression is callable during CTFE

timotheecour timothee.cour2 at gmail.com
Wed Jul 10 20:10:35 PDT 2013


On Thursday, 11 July 2013 at 02:17:13 UTC, Timothee Cour wrote:
> template isCallableCTFE(alias fun){
> template isCallableCTFE_aux(alias T){
> enum isCallableCTFE_aux=T;
> }
> enum 
> isCallableCTFE=__traits(compiles,isCallableCTFE_aux!(fun()));
> }
>
> template isCallableCTFE2(fun...){
> enum isCallableCTFE2=true;
> }
>
>
> unittest{
> int fun1(){
> return 1;
> }
> auto fun1_N(){
> import std.array;
> //would return Error: gc_malloc cannot be interpreted at 
> compile time,
> because it has no available source code due to a bug
> return [1].array;
> }
> int fun2(int x){
> return 1;
> }
> auto fun2_N(int x){
> import std.array;
> //same as fun1_N
> return [1].array;
> }
>
> int a1;
> enum a2=0;
>
> static assert(!isCallableCTFE!(()=>a1));
> static assert(isCallableCTFE!(()=>a2));
>
> static assert(isCallableCTFE!fun1);
> static assert(!isCallableCTFE!fun1_N);
>
> static assert(isCallableCTFE!(()=>fun2(0)));
> static assert(!isCallableCTFE!(()=>fun2_N(0)));
> //NOTE:an alternate syntax which could be implemented would be: 
> static
> assert(!isCallableCTFE!(fun2_N,0)));
> }


can we add this to std.traits?
it allows (among other things) to write unittests for CTFE, etc.


More information about the Digitalmars-d mailing list