如何用boost序列化glm::vec3

如何用boost序列化glm::vec3,boost,glm,boost-serialization,Boost,Glm,Boost Serialization,我正在尝试序列化Camera类中的glm::vec3变量 class Camera { glm::vec3 Position; float Yaw; private: friend class boost::serialization::access; template<typename Archive> void save(Archive& ar, const unsigned int version) const {

我正在尝试序列化Camera类中的glm::vec3变量

class Camera
{
   glm::vec3 Position;
   float Yaw;

private:
    friend class boost::serialization::access;
    template<typename Archive>
    void save(Archive& ar, const unsigned int version) const {
        ar & Position & Yaw;
    }

    template<typename Archive>
    void load(Archive& ar, const unsigned int version) {
          ar & Position & Yaw;
    }
    BOOST_SERIALIZATION_SPLIT_MEMBER()
}
class摄像机
{
glm::vec3位置;
浮动偏航;
私人:
好友类boost::serialization::access;
模板
无效保存(存档和应收账款,常量未签名整数版本)常量{
ar&位置&偏航;
}
模板
无效加载(存档和应收账款,常量未签名整数版本){
ar&位置&偏航;
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
}
现在,我正在创建另一个名为BoostGlm.h的头文件,其内容如下

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/split_free.hpp>
namespace boost
{
    namespace serialization
    {
        template<class Archive>
        void save(Archive & ar, glm::tvec3<float>& vec, const unsigned int version)
        {
            ar & boost::serialization::make_nvp("x", vec.x);
            ar & boost::serialization::make_nvp("y", vec.y);
            ar & boost::serialization::make_nvp("z", vec.z);
        }


        template<class Archive>
        void load(Archive & ar, glm::tvec3<float>& vec, const unsigned int version)
        {
            ar & boost::serialization::make_nvp("x", vec.x);
            ar & boost::serialization::make_nvp("y", vec.y);
            ar & boost::serialization::make_nvp("z", vec.z);
        }
    }
}
#包括
#包括
#包括
#包括
名称空间提升
{
命名空间序列化
{
模板
无效保存(存档和ar、glm::tvec3和vec、常量未签名整数版本)
{
ar&boost::序列化::生成nvp(“x”,vec.x);
ar&boost::序列化::生成nvp(“y”,vec.y);
ar&boost::序列化::生成nvp(“z”,vec.z);
}
模板
无效加载(归档和ar、glm::tvec3和vec、常量无符号整数版本)
{
ar&boost::序列化::生成nvp(“x”,vec.x);
ar&boost::序列化::生成nvp(“y”,vec.y);
ar&boost::序列化::生成nvp(“z”,vec.z);
}
}
}

我现在的问题是如何让boost了解如何序列化glm::vec3,我需要在哪里添加此文件。

这些文件的类型不同:

static_assert(not std::is_same_v<glm::tvec1<float>, glm::vec3>);
序列化代码实例化之前的任何位置

完整演示
/#包括
#包括
#包括
#包括
命名空间boost::序列化{
模板
无效序列化(Ar&Ar,glm::vec3&v,未签名/*未使用*/){
应收账款和make_nvp(“x”,v.x)和make_nvp(“y”,v.y)和make_nvp(“z”,v.z);
}
}
#包括
#包括
#包括
int main(){
auto constexpr inf=std::numeric_limits::infinity();
auto constexpr nan=std::numeric_limits::quiet_nan();
glm::vec3 a{1,2e8,3},b{-inf,+inf,nan};
{
boost::archive::xml\u oarchive oa(std::cout);
骨性关节炎
namespace boost::serialization {
    template <typename Ar>
    void serialize(Ar& ar, glm::vec3& v, unsigned /*unused*/) {
        ar & make_nvp("x", v.x) & make_nvp("y", v.y) & make_nvp("z", v.z);
    }
}
//#include <boost/spirit/home/x3.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/nvp.hpp>
#include <glm/glm.hpp>

namespace boost::serialization {
    template <typename Ar>
    void serialize(Ar& ar, glm::vec3& v, unsigned /*unused*/) {
        ar & make_nvp("x", v.x) & make_nvp("y", v.y) & make_nvp("z", v.z);
    }
}

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <iostream>

int main()  {
    auto constexpr inf = std::numeric_limits<double>::infinity();
    auto constexpr nan = std::numeric_limits<double>::quiet_NaN();

    glm::vec3 a{1,2e8,3}, b{-inf, +inf, nan};

    {
        boost::archive::xml_oarchive oa(std::cout);
        oa << BOOST_NVP(a) << BOOST_NVP(b);
    }
    std::cout << "\n-----\n";

    {
        boost::archive::text_oarchive oa(std::cout);
        oa << a << b;
    }
}