Is there a cleaner way of doing this?

Timon Gehr via Digitalmars-d digitalmars-d at puremagic.com
Tue Aug 8 02:03:28 PDT 2017


On 08.08.2017 08:06, Shachar Shemesh wrote:
> On 07/08/17 12:37, Timon Gehr wrote:
> 
>> struct S(T...) {
>>      T param;
>>
>>      void initialize(T param) {
>>          this.param = param;
>>          // Other stuff
>>      }
>> }
>>
>> Then, use S!() instead of S!void.
>>
> 
> It's an interesting approach. It has the down side that it also accepts 
> S!(int, string, int[23], double), and I'm still not sure what I think 
> about this option (i.e. - whether I want to allow it).
> 
> If not, then things start to look quite misleading to the user, and I'd 
> rather have the ugly static-ifs than do that.
> 
> Shachar

I don't see why not, but you can just add a template constraint:

struct S(T...) if(T.length<=1) { ... }


You can also hide the approach as an implementation detail:

struct S(T){
     static if(is(T==void)){
         private alias X = AliasSeq!();
     }else{
         private alias X = AliasSeq!T;
     }
     X param;
     void initialize(X param){
         this.param=param;
         // ...
     }
}


More information about the Digitalmars-d mailing list