write a function template specialisation that tests if an argument is known at compile time

Cecil Ward d at cecilward.com
Sun Aug 12 00:15:37 UTC 2018


On Saturday, 11 August 2018 at 18:11:15 UTC, Paul Backus wrote:
> On Saturday, 11 August 2018 at 05:17:51 UTC, Cecil Ward wrote:
>> T myfunc(T)( T x, uint mask )
>>    if ( mask == 3 )
>>    {
>>    return fast_func( x, mask );
>>    }
>>
>> but of course this doesn't work because mask is not known at 
>> compile-time. so I wondered if there is a way to do something 
>> like static if ( isKnownAtCompileTime( mask ) ) but that would 
>> not necessarily help me and probably isn't the right way.
>
> You can create an overload where `mask` is passed as a template 
> parameter:
>
> T myfunc(uint mask, T)(T x)
> {
>     static if(mask == 3) {
>         return fast_func(x, mask);
>     } else {
>         return func(x, mask);
>     }
> }
>
> The same technique is used by `std.format.format` in the 
> standard library to pass a format string that's known at 
> compile time.

Paul, what would the calls look like?

I am about to misunderstand things completely so here goes :-)

It would be a bit kludgy having to switch from one calling syntax 
to another, putting the mask argument in the template parameters 
or in the normal position. Or have I misunderstood? And if the 
caller did not use the right call syntax variant then the 
optimisation would not happen. Thing is, as it is the details are 
nicely hidden and the caller does not even need to thing about 
the fact that an (eponymous) template is being used.


More information about the Digitalmars-d-learn mailing list