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.