lundi 4 juillet 2016

how use Varidic Template to inherit multiple interface

Our project have to upgrade our serialization method from using XML to using JSON. For backward compatible reason, our class have to supply interfaces as :

class some_obj
{
public: 
    virtual bool Load(const CMarkup& xml); 
    virtual bool Load(const Json::Value& json);

    virtual bool Save(CMarup& xml);
    virtual bool Save(Json::Value& json);
}

I want to add a base class dealing with serialization issue, code as:

template<typename TImpl
        , typename Type = std::enable_if<details::SerializeTraits<TImpl>::result, details::SerializeTraits<TImpl>::ImplType>::type
    >
    class SerializableImpl
    {
    public:
        QappSerializable() = default;
        virtual ~QappSerializable() = default;

        virtual bool Load(const Type& value) = 0;
        virtual bool Save(Type& value) const = 0;
    };

    namespace details{
        template<typename Tag>
        struct SerializeTraits{
            enum{ result = false };
            //typedef typename T ImplType;
        };

        template<>
        struct SerializeTraits<CMarkup>
        {
            enum{result = true};
            typedef CMarkup ImplType;
        };

        template<>
        struct QappSerializeTraits<Json::Value>
        {
            enum{ result = true };
            typedef Json::Value ImplType;
        };
    }

After this, when a class have to be serialized, i can derive from base class , code like:

class some_xml_object: public SerializableImpl<CMarkup>
{
public:
    virtual bool Load(const CMarkup& xml){...; return true;}
    virtual bool Save(CMarkup& xml){...; return true;}
}

class some_json_object: public SerializableImpl<Json::value>
{
public:
    virtual bool Load(const Json::value& xml){...; return true;}
    virtual bool Save(Json::value& xml){...; return true;}
}

If i want to serialize as Json and XML, i have to derive from both SerializableImpl<Json::value> and SerializableImpl<CMarkup>. but i want a template more elegant using code like: class some_object : public serializable<CMarkup, Json::value>

My question is: How can i do this using Varidic template?

Aucun commentaire:

Enregistrer un commentaire