我们的项目必须将序列化方法从使用XML升级到使用JSON。出于向后兼容的原因,我们的类必须提供接口:
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);
}
我想添加一个处理序列化问题的基类,代码如下:
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;
};
}
在此之后,当一个类必须被序列化时,我可以从基类派生,代码如下:
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;}
}
如果我想序列化为Json和XML,我必须从SerializableImpl<Json::value>
和SerializableImpl<CMarkup>
派生。但我想使用以下代码更优雅的模板:
class some_object : public serializable<CMarkup, Json::value>
我的问题是: 我怎么能用Varidic模板呢?
答案 0 :(得分:3)
如果我理解正确,你正在寻找:
template <class... Type>
struct serializable : public SerializableImpl<Type>...
{};