On Wednesday, 28 June 2017 at 04:41:25 UTC, Dmitry Solomennikov
wrote:
Hi, guys!
I have templated classes like this:
class Some(T1) {
T1 value;
this(T1 _value){
value = _value;
}
}
class Pair(T1, T2) {
T1 first;
T2 second;
this(T1 _first, T2 _second){
first = _first;
second = _second;
}
}
and a lot of serialised data, which I have to read and
instantiate into given classes.
Serialized data looks like this: 'Some(Pair("df", 5.0))' or
'Pair(Some(true), 11)', i.e. order of structs, its types and
inclusion order are unknown at compile time.
I know there are several serialisation libraries, but I found
they work only with non-templated classes, like:
class Foo {
int a;
}
I can read input data and parse it, but have no idea how to
construct object of templated class in this situation. Please
give a hint.
Templates are a compile time feature. You won't be able to
initialize the classes if you don't know the type at compile time.
You can use some data structure like Variant that can save values
of different types.
You could use union for data storage in you class and list all
possible types as union members.
Probably if you have serialized data, you convert strings to
other types, so it may be possible to perfom if-checks:
if (myDataIsStringAndDouble(data))
{
auto var = new Some!(Pair!(string, double))(new Pair!(string,
double)("df", 5.0));
}
else if (myDataIsStringAndInt(data))
{
auto var = new Some!(Pair!(string, int))(new Pair!(string,
int)("df", 5));
}