On Saturday 13 February 2016 10:10:25 Larry Evans wrote: > On 02/12/2016 07:15 PM, John Ralls wrote: > >> On Feb 12, 2016, at 1:09 PM, Geert Janssens > > <geert.gnuc...@kobaltwit.be> wrote: > >> Hi, > >> > >> While working to convert the csv importer to c++ I've come across > > this issue: > [snip] > > >> To avoid code duplication, I chose to replace the struct with a > >> small > > hierarchy of classes, the > > >> base class being GncTransProperty, which handles the common parts > >> and > > derived classes for > > >> each type of value that can exist: > >> * one to keep track of an account (Account *), > >> * one to keep track of strings (std::string), > >> * one to store a time value (time64) > >> * and lastly one to keep an amount (gnc_numeric). > >> > >> I also chose a generic base class to allow the instances to be > >> stored > > in a std::vector. Which > > >> properties get stored will depend on the user choices in the GUI. > >> (I > > say "will" as that part is not > > >> set up just yet). > >> > >> Current attempt of the code is here > > https://github.com/gjanssens/gnucash/blob/cpp/src/import-export/csv-im > p/gnc-trans-props.cpp > >> and > > https://github.com/gjanssens/gnucash/blob/cpp/src/import-export/csv-im > p/gnc-trans-props.hpp > > [snip] > > > I think that what you really want to do is > > > > template <typename T> class GncTransProperty { > > > > public: > > GncTransProperty (T x, GncTransPropType p) : value{x}, property{p} > > {}; T get_value() const { return value; } > > GncTransPropType get_property() const { return property; } > > > > private: > > T value; > > GncTransPropType property; > > > > } > > [snip] > Wouldn't code here: > > https://github.com/gjanssens/gnucash/blob/cpp/src/import-export/csv-im > p/gnc-trans-props.hpp#L177 > > also have to be changed? Currently, it has: > > /** A struct containing TransProperties that all describe a single > transaction. */ > class GncTransPropertyList : public std::vector<GncTransProperty> > { > ... > }; > > But std::vector<GncTransProperty> wouldn't compile since > GncTransProperty, with your change, is now a template. > > Regards, > Larry > You're absolutely right. I have handled this by creating a purely virtual interface class GncTransProperty and use that as a base for a templated GncTransImpl implementation class.
The std::vector is now defined as std::vector<std::unique_ptr<GncTransProperty>> See current code on the same url (still not all issues have been dealt with though). Geert _______________________________________________ gnucash-devel mailing list gnucash-devel@gnucash.org https://lists.gnucash.org/mailman/listinfo/gnucash-devel