Is there a cleaner way of doing this?
Mark via Digitalmars-d
digitalmars-d at puremagic.com
Sat Aug 12 08:02:34 PDT 2017
On Monday, 7 August 2017 at 08:01:26 UTC, Shachar Shemesh wrote:
> The problem is what happens when the param is optional. The
> common way to do this is to set T to void. This results in the
> following code:
>
> struct S(T) {
> enum HasParam = !is(T == void);
> static if( HasParam ) {
> T param;
> }
>
> static if( HasParam ) {
> void initialize(T param) {
> this.param = param;
> // Other stuff
> }
> } else {
> void initialize() {
> // Same other stuff as above!
> }
> }
> }
>
> This is both tedious and error prone. Is there a cleaner way of
> doing this?
>
> Shachar
I was going to suggest using Algebraic/Variant, as in:
void initialize(Algebraic!(int,void)) {
static if(hasParam)
this.param = param;
// Other stuff
}
but unfortunately Algebraic seems very cumbersome to use. You
can't call initialize with an int (or "parameterlessly"); you
have to use it like this:
x.initialize(Algebraic!(int,void)(my_integer)); //
which is bad in many ways, e.g. you'll have to import std.variant
whenver you want to call initialize.
Ideally, I would have liked to write something like this:
void initialize( static if(hasParam) { mixin("T param"); } ) {
static if(hasParam) {
this.param = param;
}
// Other stuff
}
but of course this is currently not possible.
More information about the Digitalmars-d
mailing list