2016-07-04 11 views
2

Unser Projekt muss unsere Serialisierungsmethode von der Verwendung von XML zur Verwendung von JSON aktualisieren. Für rückwärtskompatibel Grund haben unsere Klasse Schnittstellen liefern:Wie verwenden Sie Varidic Template, um mehrere Schnittstellen zu erben

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

ich mit Serialisierung Problem zu tun, Code als eine Basisklasse hinzufügen möchten:

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

Danach, wenn eine Klasse müssen serialisiert werden, kann ich von der Basisklasse ableiten, Code wie:

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

Wenn ich will als Json und XML serialisiert werden, muss ich beide stammen aus SerializableImpl<Json::value> und SerializableImpl<CMarkup>. aber ich möchte eine Vorlage elegantere mit Code wie: class some_object : public serializable<CMarkup, Json::value>

Meine Frage ist: Wie kann ich dies mit Varidic Vorlage zu tun?

Antwort

3

Wenn ich richtig verstehe, sind Sie für diese suchen:

template <class... Type> 
struct serializable : public SerializableImpl<Type>... 
{}; 
+0

ja, das ist wirklich das, was ich für Dank bin auf der Suche –

Verwandte Themen