POD和指针类型的模板推导

时间:2018-10-07 12:02:11

标签: c++ visual-studio templates c++17

我一直在使用存档器,最近不得不重新实现它。它基于我发现的this archiver lib,但我还必须添加对使用其类型信息序列化多态对象的支持。我一直在尝试通过利用模板推导来解决此问题,但这似乎并不正确。我了解到,使用推导会将生成的方法添加到重载池中,但是我还没有发现关于是否可以使用模板定义重载的任何信息。

这是我的代码段:

class Archive {
    // ... ctor, and others

    // --- 
    template <class T>
    const Archive& operator<<(const T& v) const
    {
        *this & v;
        return *this;
    }

    template <class T>
    Archive& operator>>(T& v)
    {
        *this & v;
        return *this;
    }

    // --- 
    template <class T>
    Archive& operator&(T*& v)
    {
        Serializer::LoadObject(v);
        return *this;
    }

    template <class T>
    const Archive& operator&(const T*& v) const
    {
        Serializer::StoreObject(v);
        return *this;
    }

    template <class T>
    Archive& operator&(T& v)
    {
        v.Serialize(*this);
        return *this;
    }

    template <class T>
    const Archive& operator&(const T& v) const
    {
        ((T&)(v)).Serialize(*this);
        return *this;
    }

    // ... the rest of the implementation, serializers for POD, arrays and STL containers    
};

此的基本用法是

struct SomePoco{
    int m_someMember;
    int m_someOtherMember;
    template<class AR> void Srerialize(AR&ar){
        ar & m_someMember & m_someOtherMember;
    }
};

效果很好。如果我要使用对象的指针,它将看起来像这样-过于简化了,不必担心清洁程度,只是为了记录:

class SomeSerializableClass : public Serializable{
public:
    // ... some macros that adds Serializable implementations
    template<class AR> void Srerialize(AR&ar){
        ar & m_someMember & m_someOtherMember;
    }    
private:
    int m_someMember;
    int m_someOtherMember;
}

SomeSerializableClass *obj = new SomeSerializableClass();
Archive ar;
ar << obj;
// ... rest of the stuff

在这种情况下,我想称呼安装了template <class T> const Archive& Archive::operator&(const T*& v) const的{​​{1}}。推论是这样的:template <class T> const Archive& operator&(const T& v) const其中template <class T> const Archive& operator&(const T& v) const

问题是: -是否有任何方法可以使用自定义扣除规则来覆盖此扣除行为,或者 -是否有任何方法可以禁用对指针类型的推导,因此我可以在类之外定义自己的运算符函数?

更新: 我已经通过type_trais下面的[em>建议挖了自己,而我对此一无所知。有了这种特征,它似乎在Visual Studio 2017上似乎并不起作用。

T = SomeSerializableClass *

我还咨询了VS中的实现;按规范template <class T, class = class std::enable_if<std::is_class<T>>::type> Archive& operator&(T& v) { v.Serialize(*this); return *this; } template <class T, class = class std::enable_if<std::is_class<T>>::type> const Archive& operator&(const T& v) const { const_cast<T&>(v).Serialize(*this); return *this; } 对我来说很好,因为我正在寻找具有is_object功能的那些对象,无论它们是类的实例还是结构的实例。但是,Serialize在VS中是完全不同的东西,关闭特征是is_object

你们还有什么建议吗?

0 个答案:

没有答案