C++ and derived classes issue
Larry Evans
cppljevans at suddenlink.net
Sat Feb 13 18:56:31 EST 2016
On 02/13/2016 03:14 PM, John Ralls wrote:
>
>> On Feb 13, 2016, at 12:25 PM, Larry Evans <cppljevans at suddenlink.net> wrote:
>>
>>
>>
>> On 02/13/2016 01:03 PM, John Ralls wrote:
>> [snip]
>>> You started out trying to encapsulate an object and a flag that
>> indicated where to put it. That had genericity problems because there's
>> no type-safe way to generically handle the differing return types.
>> Polymorphism to the rescue! Except that it turns out that you have
>> different handling requirements depending not on the type that you're
>> storing but on the actual property that you're processing.
>>>
>>> How about this:
>>> template <typename T, GncTransPropType p> class GncTransPropImpl {
>>> public:
>>> GncTransPropImpl (T v) : value {v} {}
>>> ...
>>> friend template<>void
>> set_property(std::unique_ptr<GncTransPropImpl<T, P>> prop, Transaction
>> *txn);
>>> friend template<>void
>> set_property(std::unique_ptr<GncTransPropImpl<T, P>> prop, Split *split);
>>> private:
>>> T value;
>>> }
>>
>> Why not make T a metafunction of p? IOW, define:
>>
>> template<GncTransPropType Index>
>> struct PropIndex2PropType
>> ;
>>
>> template<>
>> struct PropIndex2PropType<ACCOUNT>
>> {
>> using Type = Account*;
>> };
>> template <GncTransPropType p> class GncTransPropImpl {
>> public:
>> using T = typename PropIndexPropType::type;
>> GncTransPropImpl (T v) : value {v} {}
>> ...
>> private:
>> T value;
>> };
>>
>> That way one template argument is avoided.
>> You could also just define a typelist using
>> maybe boost::mpl::vector<T0,T1,T2,...>
>> and index into that instead of using PropIndex2PropType.
>>
>
The following Gist illustrates this mpl::vector prototype:
https://gist.github.com/cppljevans/30990f76f6d2917f21c8
HTH.
-regards,
Larry
More information about the gnucash-devel
mailing list