On Thursday, 11 August 2016 at 20:43:13 UTC, Meta wrote:
On Thursday, 11 August 2016 at 18:11:30 UTC, Engine Machine wrote:
[...]

It can be done, but you have to be explicit and should think very carefully if this is really a good design.

struct X(int defaultSize = 100)
{
    int size;
    int* p;

    void foo(int size)
    {
        size = max(size, defaultSize);
        p = cast(int*)malloc(size);
    }

    X opAssign(X2: X!n, int n)(X2 other)
    {
        //Do whatever you want here
    }

    X2 changeDefaultSize(int n)()
    {
        auto newX = X!n(n, p);
        p = null; //Release ownership of p

        return newX;
    }
}

void takesX50(X!50 x)
{
    //...
}

void main()
{
    X!100 n;
    X!100 m;
    X!50 o;

    n = m;
    o = m;

    takesX50(n); //Error
    takesX50(n.changeDefaultSize!50); //Okay
}

Really though this problem is properly solved by runtime polymorphism.

Thanks. I am using templates and in some cases use template arguments to set compile time properties, hence runtime won't work. These arguments don't affect the type itself, as far as the functionality/behavior as I use them.

Reply via email to