| Thread overview | |||||||
|---|---|---|---|---|---|---|---|
|
September 21, 2017 How to check if string is available at compile time | ||||
|---|---|---|---|---|
| ||||
Hi Guys,
Is there an easy way to check if the value of string passed to a template is available at compile time?
Here is a cut down example of that I'm doing:
```
string[] escapeCTFE(Args...)(){
static foreach (arg; Args){
static if(__traits(compiles, ###WHATDOIPUTHERE###)){
pragma(msg, "Do work on string: ", arg);
}else{
pragma(msg, __traits(identifier, arg), " can only be read at runtime");
}
}
}
void main(){
string a = "a";
static string b = "b";
enum string c = "c";
immutable string d = "d";
const string e = "e";
enum escape_as_much_as_possible = escapeCTFE!(a,b,c,d,e,"f");
}
```
I know for ints I can use __traits(compiles, int[arg]) but I'm not sure about strings.
I believe only a and b should be hidden from pragma right?
Thanks,
David.
| ||||
September 21, 2017 Re: How to check if string is available at compile time | ||||
|---|---|---|---|---|
| ||||
Posted in reply to David Bennett | On Thursday, 21 September 2017 at 11:42:36 UTC, David Bennett wrote:
> [snip]
>
> ```
> string[] escapeCTFE(Args...)(){
>
> static foreach (arg; Args){
> static if(__traits(compiles, ###WHATDOIPUTHERE###)){
> [snip]
So far the best I've come up with is :
```
enum isCTstring(alias arg) = (!isAssignable!(typeof(arg)) || __traits(compiles, mixin(` "foo" ~ `~__traits(identifier, arg))));
string[] escapeCTFE(Args...)(){
static foreach (arg; Args){
static if(isCTstring!(arg)){
pragma(msg, "Do work on string: ", arg);
}else{
pragma(msg, __traits(identifier, arg), " can only be read at runtime");
}
}
return new string[32];
}
```
But this seems quite hackish... any better ideas?
| |||
September 21, 2017 Re: How to check if string is available at compile time | ||||
|---|---|---|---|---|
| ||||
Posted in reply to David Bennett | On Thursday, 21 September 2017 at 12:30:15 UTC, David Bennett wrote:
> On Thursday, 21 September 2017 at 11:42:36 UTC, David Bennett wrote:
>> [snip]
>>
>> ```
>> string[] escapeCTFE(Args...)(){
>>
>> static foreach (arg; Args){
>> static if(__traits(compiles, ###WHATDOIPUTHERE###)){
>> [snip]
>
>
> So far the best I've come up with is :
>
> ```
>
> enum isCTstring(alias arg) = (!isAssignable!(typeof(arg)) || __traits(compiles, mixin(` "foo" ~ `~__traits(identifier, arg))));
>
> string[] escapeCTFE(Args...)(){
>
> static foreach (arg; Args){
> static if(isCTstring!(arg)){
> pragma(msg, "Do work on string: ", arg);
> }else{
> pragma(msg, __traits(identifier, arg), " can only be read at runtime");
> }
> }
> return new string[32];
> }
>
> ```
>
> But this seems quite hackish... any better ideas?
Try __traits(compiles, { enum _ = arg; }). Creating an enum necessarily requires that its value is available at compile time.
| |||
September 21, 2017 Re: How to check if string is available at compile time | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Meta | On Thursday, 21 September 2017 at 13:52:25 UTC, Meta wrote:
> On Thursday, 21 September 2017 at 12:30:15 UTC, David Bennett wrote:
>> On Thursday, 21 September 2017 at 11:42:36 UTC, David Bennett wrote:
>>
>> enum isCTstring(alias arg) = (!isAssignable!(typeof(arg)) || __traits(compiles, mixin(` "foo" ~ `~__traits(identifier, arg))));
>>
>> [snip]
>>
>> But this seems quite hackish... any better ideas?
>
> Try __traits(compiles, { enum _ = arg; }). Creating an enum necessarily requires that its value is available at compile time.
Ahh, warping it in {} seems to change the timing of the execution, this is starting to make a lot of sense to me now. (also explains why int[arg] works).
Thats much cleaner and I'll use that from now on.
Thanks a lot!
David
| |||
September 22, 2017 Re: How to check if string is available at compile time | ||||
|---|---|---|---|---|
| ||||
Posted in reply to David Bennett | On Thursday, 21 September 2017 at 11:42:36 UTC, David Bennett wrote: > Hi Guys, > > Is there an easy way to check if the value of string passed to a template is available at compile time? > Yeah , sure and I have such a template in my library: https://github.com/BBasile/iz/blob/master/import/iz/types.d#L627 see just above too, the template "isCompileTimeValue" | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply