On Monday, 18 January 2016 at 21:15:51 UTC, Chris Wright wrote:
On Mon, 18 Jan 2016 19:19:22 +0000, Voitech wrote:
Hi. I'm trying to parse an simple string expression to
something like Element array. Each Element can have a value of
unknown type, which will be further combined and calculated to
let say real/double/float value, no mather.
In Java, Element<T> is always Element<Object> behind the
scenes, and there's only one type.
In D, Element(T) is a template that produces a type.
Element!int and Element!Object are entirely different and,
thanks to what templates allow you to do, the compiler can't
assume any relationship between the two.
You have to establish that relationship manually by creating a
base type:
abstract class BaseElement {
}
class Element(T) : BaseElement {
T value;
}
Alternatively, if this is not appropriate to your usecase, you
may want to look at std.variant, which explicitly implements
value boxing.
Thank you for answering. I think i will use std.variant.Algebraic
implementation for my needs. But about Algebraic... why first
template parameter of it must be always int. Let say i want to
store only real and string in Algebraic no int.
if i try to do something like :
alias Element =Algebraic!(real,string);
i will get:
Cannot store a int in a VariantN!(16LU, real, string)
if i declare as:
alias Element =Algebraic!(int,real,string);
this will be ok.
But anything other than Algebraic!(int,x,y,z...) doesn't compile,
like:
alias Element =Algebraic!(uint,bool,string); //compilation error
alias Element =Algebraic!(ulong,Object,bool); //compilation error
alias Element =Algebraic!(long,real,string); //compilation error
Why is that ?
Cheers Voitech.