test if the alias of a template is a literal

Basile B. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Oct 27 20:33:33 PDT 2016


On Thursday, 27 October 2016 at 14:04:23 UTC, Gianni Pisetta 
wrote:
> Hi all,
> I have an AliasSeq composed of literal strings, variables and 
> delegates. I want to build a template Optimize that will return 
> an AliasSeq that have all adjacent literals concatenated into 
> one. So i writed something like this:
>
> template isStringLiteral(alias V) {
>     enum bool isStringLiteral = ( is( typeof( V ) == string ) );
> }
>
> template Optimize(Os...) {
>     static if ( Os.length < 2 )
>         alias Optimize = Os;
>     else {
>         alias Optimized = Optimize!(Os[1..$]);
>
>         static if ( isStringLiteral!(Os[0]) && 
> isStringLiteral!(Optimized[0]) ) {
>             enum string First = Os[0] ~ Optimized[0];
>             alias Rest = Optimized[1..$];
>         }
>         else {
>             alias First = AliasSeq!(Os[0]);
>             alias Rest = Optimized;
>         }
>         alias Optimize = AliasSeq!(First, Rest);
>     }
> }
>
> but at the moment isStringLiteral will return true even with 
> variables of type string. So i searched for a metod to check if 
> an alias is a literal value, but found nothing. Anyone have any 
> clue on how can be done?
>
> Thanks,
> Gianni Pisetta

Hello, I think the correct isStringLiteral would be:

import
     std.meta;

template isStringLiteral(alias V)
{
     enum isCompileTime = is(typeof((){enum a = V;}));
     enum isString = is(typeof(V) == string);
     enum isStringLiteral = isCompileTime && isString;
}

unittest
{
     string a;
     enum b = "0";
     enum c = 0;
     static assert(!isStringLiteral!a);
     static assert(isStringLiteral!b);
     static assert(!isStringLiteral!c);
}

It's decomposed to show the logic:

1. If the delegate that assigns the parameter to a compile-time 
enum is valid we know that the parameter value is defined at 
compile-time.
2. check that the parameter is a string.


More information about the Digitalmars-d-learn mailing list