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