Is there a cleaner way of doing this?
Dgame via Digitalmars-d
digitalmars-d at puremagic.com
Mon Aug 7 12:22:22 PDT 2017
On Monday, 7 August 2017 at 08:01:26 UTC, Shachar Shemesh wrote:
> It is often desired to have a struct with an extra parameter.
> The common way to do this is like so:
>
> struct S(T) {
> T param;
>
> void initialize(T param) {
> this.param = param;
> // Other stuff
> }
> }
>
> 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?
>
> Just as an unrealistic fantasy, if the following code was
> legal, the problem would be resolved on its own:
> void func(void p) {
> void param;
>
> param = p;
>
> return param;
> }
>
>
> Of course, that code has its own set of problems, and I'm not
> really suggesting that change.
>
> Shachar
Why don't you use a factory method?
struct S(T)
{
T p;
static make(T p)
{
S s;
s.p = p;
return s;
}
static make()
{
return S();
}
}
void main()
{
auto s1 = S!int.make;
auto s2 = S!string.make;
}
More information about the Digitalmars-d
mailing list