使用Boost Fusion库中的pair:一个实例

372 篇文章 ¥29.90 ¥99.00
本文介绍了Boost Fusion库中的pair,用于存储键值对。通过示例展示了如何创建、访问和修改pair,包括使用make_pair创建新pair,用at_key和at函数访问成员,以及用map_insert函数进行修改。

使用Boost Fusion库中的pair:一个实例

Boost Fusion是一个提供常见序列操作的C++模板库,包括元组、类型列表和适配器等。其中,pair是一个非常有用的数据结构,用于存储两个数值或对象之间的键-值对关系。本文将介绍如何使用boost::fusion::pair来创建、访问和修改键-值对。

创建pair

使用boost::fusion::pair时,需要注意在引入库时添加以下头文件:

#include <boost/fusion/include/pair.hpp>

然后就可以定义pair对象了,如下所示:

boost::fusion::pair<int
1>F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(86,5): error C2672: “PackageParamsImpl”: 未找到匹配的重载函数 1>(编译源文件“../../../src/others/interprocess/Interface/MediaWindowControllerInterface.cpp”) 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(78,6): 1> 可能是“void InterprocSerialization::PackageParamsImpl(boost::archive::binary_oarchive &,const Tuple &,std::integer_sequence<size_t,_Kx...>)” 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(86,5): 1> “void InterprocSerialization::PackageParamsImpl(boost::archive::binary_oarchive &,const Tuple &,std::integer_sequence<size_t,_Kx...>)”: 无法从“boost::fusion::detail::make_index_sequence<1>”推导出“std::integer_sequence<size_t,_Kx...>”的 模板 参数 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(86,5): 1> 模板实例化上下文(最早的实例化上下文)为 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interface\MediaWindowControllerInterface.cpp(52,29): 1> 查看对正在编译的函数 模板 实例化“void InterprocSerialization::PackageParams<int>(boost::archive::binary_oarchive &,const std::tuple<int> &)”的引用 1>IPCAPPDownloader.cpp 1>IPCAppEnterpriseListContext.cpp 1>F:\updateVPC\vpc2_newest\vms\vms-public\vms-client\SurveillanceSystem\SurveillanceSystem\widget\preview\PreviewViewScaleWidget.h(20,9): warning C4005: “SCALE_IMAGE_PICTUR_MIN_HEIGHT”: 宏重定义 1>(编译源文件“../../../src/others/interprocess/Interproc/TPFunctionBindUtils.cpp”) 1> F:\updateVPC\vpc2_newest\vms\vms-public\vms-client\SurveillanceSystem\SurveillanceSystem\widget\preview\PreviewScaleImageWidget.h(20,9): 1> 参见“SCALE_IMAGE_PICTUR_MIN_HEIGHT”的前一个定义 1>F:\updateVPC\vpc2_newest\vms\vms-public\vms-client\SurveillanceSystem\SurveillanceSystem\widget\preview\PreviewViewScaleWidget.h(21,9): warning C4005: “SCALE_IMAGE_PICTUR_MIN_WIDTH”: 宏重定义 1>(编译源文件“../../../src/others/interprocess/Interproc/TPFunctionBindUtils.cpp”) 1> F:\updateVPC\vpc2_newest\vms\vms-public\vms-client\SurveillanceSystem\SurveillanceSystem\widget\preview\PreviewScaleImageWidget.h(21,9): 1> 参见“SCALE_IMAGE_PICTUR_MIN_WIDTH”的前一个定义 1>F:\updateVPC\vpc2_newest\vms\vms-public\vms-client\SurveillanceSystem\SurveillanceSystem\widget\preview\PreviewViewScaleWidget.h(20,9): warning C4005: “SCALE_IMAGE_PICTUR_MIN_HEIGHT”: 宏重定义 1>(编译源文件“../../../src/others/interprocess/Interproc/TPWindowControllerEntry.cpp”) 1> F:\updateVPC\vpc2_newest\vms\vms-public\vms-client\SurveillanceSystem\SurveillanceSystem\widget\preview\PreviewScaleImageWidget.h(20,9): 1> 参见“SCALE_IMAGE_PICTUR_MIN_HEIGHT”的前一个定义 1>F:\updateVPC\vpc2_newest\vms\vms-public\vms-client\SurveillanceSystem\SurveillanceSystem\widget\preview\PreviewViewScaleWidget.h(21,9): warning C4005: “SCALE_IMAGE_PICTUR_MIN_WIDTH”: 宏重定义 1>(编译源文件“../../../src/others/interprocess/Interproc/TPWindowControllerEntry.cpp”) 1> F:\updateVPC\vpc2_newest\vms\vms-public\vms-client\SurveillanceSystem\SurveillanceSystem\widget\preview\PreviewScaleImageWidget.h(21,9): 1> 参见“SCALE_IMAGE_PICTUR_MIN_WIDTH”的前一个定义 1>IPCAppExcutorBasicCloud.cpp 1>F:\updateVPC\vpc2_newest\vms\vms-public\vms-client\SurveillanceSystem\SurveillanceSystem\widget\preview\PreviewViewScaleWidget.h(20,9): warning C4005: “SCALE_IMAGE_PICTUR_MIN_HEIGHT”: 宏重定义 1>(编译源文件“../../../src/context/IPCAppContext.cpp”) 1> F:\updateVPC\vpc2_newest\vms\vms-public\vms-client\SurveillanceSystem\SurveillanceSystem\widget\preview\PreviewScaleImageWidget.h(20,9): 1> 参见“SCALE_IMAGE_PICTUR_MIN_HEIGHT”的前一个定义 1>F:\updateVPC\vpc2_newest\vms\vms-public\vms-client\SurveillanceSystem\SurveillanceSystem\widget\preview\PreviewViewScaleWidget.h(21,9): warning C4005: “SCALE_IMAGE_PICTUR_MIN_WIDTH”: 宏重定义 1>(编译源文件“../../../src/context/IPCAppContext.cpp”) 1> F:\updateVPC\vpc2_newest\vms\vms-public\vms-client\SurveillanceSystem\SurveillanceSystem\widget\preview\PreviewScaleImageWidget.h(21,9): 1> 参见“SCALE_IMAGE_PICTUR_MIN_WIDTH”的前一个定义 1>F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(57,61): error C2672: “GetTuple”: 未找到匹配的重载函数 1>(编译源文件“../../../src/others/interprocess/Interproc/TPFunctionBindUtils.cpp”) 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(28,7): 1> 可能是“Tuple InterprocSerialization::GetTuple(boost::archive::binary_iarchive *,std::integer_sequence<size_t,_Kx...>)” 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(57,61): 1> “Tuple InterprocSerialization::GetTuple(boost::archive::binary_iarchive *,std::integer_sequence<size_t,_Kx...>)”: 无法从“boost::fusion::detail::make_index_sequence<1>”推导出“std::integer_sequence<size_t,_Kx...>”的 模板 参数 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(57,61): 1> 模板实例化上下文(最早的实例化上下文)为 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\TPFunctionBindUtils.cpp(55,23): 1> 查看对正在编译的函数 模板 实例化“InterprocError InterprocMsgManager::Subscribe<void(int)>(const std::string,R (__cdecl *),const std::string)”的引用 1> with 1> [ 1> R=void (int) 1> ] 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocMsgManager.h(22,16): 1> 查看对正在编译的函数 模板 实例化“long InterprocListener::RegisterCallback<R>(std::string,R (__cdecl *))”的引用 1> with 1> [ 1> R=void (int) 1> ] 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocListener.h(26,27): 1> 查看对正在编译的函数 模板 实例化“void InterprocSerialization::Bind<R>(std::map<std::string,std::function<void (boost::archive::binary_oarchive *,boost::archive::binary_iarchive *)>,std::less<std::string>,std::allocator<std::pair<const std::string,std::function<void (boost::archive::binary_oarchive *,boost::archive::binary_iarchive *)>>>> &,std::string,R (__cdecl *))”的引用 1> with 1> [ 1> R=void (int) 1> ] 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(73,34): 1> 查看对正在编译的函数 模板 实例化“void InterprocSerialization::CallProxy<R>(R (__cdecl *),boost::archive::binary_oarchive *,boost::archive::binary_iarchive *)”的引用 1> with 1> [ 1> R=void (int) 1> ] 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(65,5): 1> 查看对正在编译的函数 模板 实例化“void InterprocSerialization::CallProxy_<void,int>(R (__cdecl *)(int),boost::archive::binary_oarchive *,boost::archive::binary_iarchive *)”的引用 1> with 1> [ 1> R=void 1> ] 这是我的源码: #pragma once #include <map> #include <string> #include <functional> #include <boost/archive/binary_iarchive.hpp> #include <boost/archive/binary_oarchive.hpp> #include <boost/fusion/support/detail/index_sequence.hpp> #include <tuple> #include <boost/serialization/vector.hpp> namespace InterprocSerialization { template<typename T> struct type_transfer { typedef T type; }; template<> struct type_transfer<void> { typedef int type; }; template< typename ... T > using index_sequence_for = boost::fusion::detail::make_index_sequence< sizeof ... (T) >; template<typename... Params> std::tuple<typename std::decay<Params>::type...> MakeTuple(Params... ps) { return std::make_tuple(ps...); } template<typename Tuple, std::size_t... I> Tuple GetTuple(boost::archive::binary_iarchive* ia, boost::fusion::detail::index_sequence<I...>) { Tuple t; std::initializer_list<int>{ ((*ia >> std::get<I>(t)), 0)... }; return t; } template<typename R, typename... Params, typename Tuple, std::size_t... Index > typename R invoke(R(*f)(Params...), Tuple&& t, boost::fusion::detail::index_sequence<Index...>) { return f(std::get<Index>(std::forward<Tuple>(t))...); } template<typename R, typename F, typename ArgsTuple> typename std::enable_if<std::is_same<R, void>::value, typename type_transfer<R>::type>::type CallHelper(F f, ArgsTuple args) { invoke(f, args, boost::fusion::detail::make_index_sequence<std::tuple_size<typename std::decay<ArgsTuple>::type>::value>{}); return 0; } template<typename R, typename F, typename ArgsTuple> typename std::enable_if<!std::is_same<R, void>::value, typename type_transfer<R>::type>::type CallHelper(F f, ArgsTuple args) { return invoke(f, args, boost::fusion::detail::make_index_sequence<std::tuple_size<typename std::decay<ArgsTuple>::type>::value>{}); } template<typename R, typename... Params> void CallProxy_(R(*f)(Params... ps), boost::archive::binary_oarchive* oa, boost::archive::binary_iarchive* ia) { std::tuple<typename std::decay<Params>::type...> args = GetTuple<std::tuple<typename std::decay<Params>::type...> >(ia, boost::fusion::detail::make_index_sequence<sizeof...(Params)>()); typename type_transfer<R>::type ret = CallHelper<R>(f, args); } template<typename R> void CallProxy(R(*f), boost::archive::binary_oarchive* oa, boost::archive::binary_iarchive* ia) { CallProxy_(f, oa, ia); } template<typename R> void Bind(std::map<std::string, std::function<void(boost::archive::binary_oarchive*, boost::archive::binary_iarchive*)> > &handlers, std::string fname, R(*f)) { // todo ����У�� handlers[fname] = std::bind(&CallProxy<R>, f, std::placeholders::_1, std::placeholders::_2); } template<typename Tuple, std::size_t... Is> void PackageParamsImpl(boost::archive::binary_oarchive& oa, const Tuple& t, boost::fusion::detail::index_sequence<Is...>) { std::initializer_list<int>{ ((oa << std::get<Is>(t)), 0)... }; } template<typename... Args> void PackageParams(boost::archive::binary_oarchive& oa, const std::tuple<Args...>& t) { PackageParamsImpl(oa, t, index_sequence_for<Args...>{}); } } // namespace InterProSerialization 为什么会报错???
11-11
1>F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(57,61): error C2672: “GetTuple”: 未找到匹配的重载函数 1>(编译源文件“../../../src/others/interprocess/Interproc/TPFunctionBindUtils.cpp”) 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(28,7): 1> 可能是“Tuple InterprocSerialization::GetTuple(boost::archive::binary_iarchive *,std::integer_sequence<size_t,_Kx...>)” 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(57,61): 1> “Tuple InterprocSerialization::GetTuple(boost::archive::binary_iarchive *,std::integer_sequence<size_t,_Kx...>)”: 无法从“boost::fusion::detail::make_index_sequence<1>”推导出“std::integer_sequence<size_t,_Kx...>”的 模板 参数 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(57,61): 1> 模板实例化上下文(最早的实例化上下文)为 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\TPFunctionBindUtils.cpp(55,23): 1> 查看对正在编译的函数 模板 实例化“InterprocError InterprocMsgManager::Subscribe<void(int)>(const std::string,R (__cdecl *),const std::string)”的引用 1> with 1> [ 1> R=void (int) 1> ] 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocMsgManager.h(22,16): 1> 查看对正在编译的函数 模板 实例化“long InterprocListener::RegisterCallback<R>(std::string,R (__cdecl *))”的引用 1> with 1> [ 1> R=void (int) 1> ] 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocListener.h(26,27): 1> 查看对正在编译的函数 模板 实例化“void InterprocSerialization::Bind<R>(std::map<std::string,std::function<void (boost::archive::binary_oarchive *,boost::archive::binary_iarchive *)>,std::less<std::string>,std::allocator<std::pair<const std::string,std::function<void (boost::archive::binary_oarchive *,boost::archive::binary_iarchive *)>>>> &,std::string,R (__cdecl *))”的引用 1> with 1> [ 1> R=void (int) 1> ] 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(73,34): 1> 查看对正在编译的函数 模板 实例化“void InterprocSerialization::CallProxy<R>(R (__cdecl *),boost::archive::binary_oarchive *,boost::archive::binary_iarchive *)”的引用 1> with 1> [ 1> R=void (int) 1> ] 1> F:\updateVPC\vpc2_newest\vms\vms-public\src\others\interprocess\Interproc\InterprocSerialization.h(65,5): 1> 查看对正在编译的函数 模板 实例化“void InterprocSerialization::CallProxy_<void,int>(R (__cdecl *)(int),boost::archive::binary_oarchive *,boost::archive::binary_iarchive *)”的引用 1> with 1> [ 1> R=void 1> ] 1>IPCAppHeatmapDataTask.cpp
11-11
基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值