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?
ja, das ist wirklich das, was ich für Dank bin auf der Suche –