如何使用可变模板来继承多个接口
how use Varidic Template to inherit multiple interface
我们的项目必须将序列化方法从使用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>
我的问题是:我如何使用可变模板做到这一点?
如果我理解正确,您正在寻找这个:
template <class... Type>
struct serializable : public SerializableImpl<Type>...
{};
相关文章:
- Qt Quick - 如何在 qml 接口中使用继承自 QQuickPaintedItem 的 c++ 类?
- C++接口继承不同的参数方法
- c++ com 如何继承 IUIAutomationPropertyChangedEventHandler 接口
- C++ 使用接口和默认实现继承
- C++ 通过接口使用从其他几个类继承的类
- 如何在C++中访问 DirectWrite 继承的接口?
- 接口的钻石继承(C++)
- 将实现从继承的 CRTP 注入到继承的接口类
- C++:继承自基类和具有公共基接口的多个接口
- 接口实现和私有继承之间的交互
- 替代与djinni的接口继承
- C++ 接口类继承自具体类是否合理
- C++接口、继承、多态性
- 继承接口实现
- 继承C++接口和 LSP 冲突
- 为什么C++不允许基类实现派生类的继承接口?
- 物理引擎的继承/接口决策
- 使用继承接口的类的子类方法
- 我的类如何继承接口和QObject
- 从基础对象继承接口是一种好的做法吗