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

renoX renosky at free.fr
Thu Feb 22 14:29:59 PST 2007


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


More information about the Digitalmars-d-learn mailing list