如何使用可变模板来继承多个接口

how use Varidic Template to inherit multiple interface

本文关键字:继承 接口 何使用      更新时间:2023-10-16

我们的项目必须将序列化方法从使用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>...
{};