have get_datatype() return a pointer since DataType is an object with virtual methods
support for complex<double>
migrated to structs since there is no c++ partial specialization of function templates in c++

now std::complex<> works for any of the data types we support