代码之家  ›  专栏  ›  技术社区  ›  B. A. Sylla

两种特殊方法中的相同代码

  •  1
  • B. A. Sylla  · 技术社区  · 8 年前

    我有一个带有空模板方法的类:

    // my method in a class
    template<class U>
    void save(U& archive, const unsigned int version) const {
        // empty
    }
    

    我在同一个标头中的类后面有三个特殊化,但其中两个具有相同的代码:

    template<>
    void Dataset1::save(boost::archive::xml_oarchive& archive, const unsigned int version) const {
        archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Dataset0);
        archive & BOOST_SERIALIZATION_NVP(m_a1_);
        archive & BOOST_SERIALIZATION_NVP(m_b1_);
    }
    
    template<>
    void Dataset1::save(boost::archive::text_oarchive& archive, const unsigned int version) const {
        archive & boost::serialization::base_object<Dataset0>(*this);
        archive & m_a1_;
        archive & m_b1_;
    }
    
    template<>
    void Dataset1::save(boost::archive::binary_oarchive& archive, const unsigned int version) const {
        archive & boost::serialization::base_object<Dataset0>(*this);
        archive & m_a1_;
        archive & m_b1_;
    }
    
    1. 有没有更好的方法来做我想做的事?
    1 回复  |  直到 8 年前
        1
  •  1
  •   Curious    8 年前

    class Dataset1 {
    
        ... 
    
    private:
        template <typename T>
        void save_impl_text_binary(T& archive, const unsigned int version) const {
            archive & boost::serialization::base_object<Dataset0>(*this);
            archive & m_a1_;
            archive & m_b1_;
        }
    };
    
    template<>
    void Dataset1::save(boost::archive::xml_oarchive& archive, const unsigned int version) const {
        archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Dataset0);
        archive & BOOST_SERIALIZATION_NVP(m_a1_);
        archive & BOOST_SERIALIZATION_NVP(m_b1_);
    }
    
    template<>
    void Dataset1::save(boost::archive::text_oarchive& archive, const unsigned int version) const {
        this->save_impl_text_binary(archive, version);
    }
    
    template<>
    void Dataset1::save(boost::archive::binary_oarchive& archive, const unsigned int version) const {
        this->save_impl_text_binary(archive, version);
    }