如何使用Varidic Template继承多个接口

时间:2016-07-04 10:10:13

标签: c++ c++11 variadic-templates

我们的项目必须将序列化方法从使用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模板呢?

1 个答案:

答案 0 :(得分:3)

如果我理解正确,你正在寻找:

template <class... Type>
struct serializable : public SerializableImpl<Type>...
{};