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));
}

Reply via email to