Distinguishing between const and non-const variable in a template?

Chris Nicholson-Sauls ibisbasenji at gmail.com
Thu Feb 22 16:43:30 PST 2007


Chris Nicholson-Sauls wrote:
> renoX wrote:
>> mario pernici a écrit :
>>> Deewiant Wrote:
>>>
>>>> renoX wrote:
>>>>> mario pernici a écrit :
>>>>>> renoX Wrote:
>>>>>>
>>>>>>> Hello,
>>>>>>>
>>>>>>> I'm trying to improve format string by allowing the format
>>>>>>> " ... %{x} ...", my problem is that when I give a non-const char[]
>>>>>>> parameter in
>>>>>>> mixin(Putf!(foo));
>>>>>>>
>>>>>>> then the template fail..
>>>>>>>
>>>>>>> How can I reliably detect in a template if the parameter is a
>>>>>>> constant or not?
>>>>> [cut]
>>>>>> Maybe you can use something like this
>>>>>>
>>>>>>   const char[] s = "ab";
>>>>>>   static if(is(typeof(&s))) {
>>>>>>     writefln(s, " not constant");
>>>>>>   }
>>>>>>   else {
>>>>>>     static if(is(typeof(s))) {
>>>>>>       writefln(s, " constant");
>>>>>>     }
>>>>>>   }
>>>>> Very nice, thanks!
>>>>>
>>>>> I'm curious: how did you find this??
>>>>> I don't recall seeing it in the documentation and it looks kind of
>>>>> magical to me..
>>>>>
>>>>> Thanks again,
>>>>> renoX
>>>>>
>>>> He probably just figured it out: you can't take the address of a 
>>>> constant, so
>>>> is(typeof(&s)) is false if s is a constant. I'm not sure about the 
>>>> necessity of
>>>> the is(typeof(s)) in the else case, though.
>>>>
>>>
>>> I learned about static if (is(typeof(...)))
>>> from the post by Kirk McDonald
>>> in the recent thread "Testing if a function is defined in a module".
>>>
>>> The else clause static if(is(typeof(s))) is to make
>>> sure that s exists.
>>
>> Mmm; how could s doesn't exist?
>> D is supposed to be a statically typed language..
>>
>> renoX
> 
> version (Something) import some.convoluted.library;
> else                import some.limited.standIn;
> 
> // ... much later in module
> static if(is(typeof(someSymbolNotInStandIn))) {
>   // ... do things usual way
> }
> else {
>   // ... do it a work-around way for the stand in's case
> }
> 
> -- Chris Nicholson-Sauls

Yes its a contrived example, but its possible.  (And yes I know in this case 
version(Something) would be better than static-if, but what if the stand-in is subject to 
change without notice?)

Another use case: a hypothetical GUI library that, in the absence of a main routine, uses 
its own generic one?  (Wouldn't work all GUI lib designs, of course.)

-- Chris Nicholson-Sauls


More information about the Digitalmars-d-learn mailing list