Wraping legacy code
如何处理不打算在BehaviorTree.CPP中使用的旧代码;
类可能是如下:
// This is my custom type. struct Point3D { double x,y,z; }; // We want to create an ActionNode to calls method MyLegacyMoveTo::go class MyLegacyMoveTo { public: bool go(Point3D goal) { printf("Going to: %f %f %f\n", goal.x, goal.y, goal.z); return true; // true means success in my legacy code } };
需要去实现convertFromString
.
namespace BT { template <> Point3D convertFromString(StringView key) { // three real numbers separated by semicolons auto parts = BT::splitString(key, ';'); if (parts.size() != 3) { throw RuntimeError("invalid input)"); } else{ Point3D output; output.x = convertFromString<double>(parts[0]); output.y = convertFromString<double>(parts[1]); output.z = convertFromString<double>(parts[2]); return output; } } } // end anmespace BT
为了去封装方法MyLegacyMoveTo::go,需要一个lambda或者std::bind函数去创建一个指针以及一个SimpleActionNode;
static const char* xml_text = R"( <root> <BehaviorTree> <MoveTo goal="-1;3;0.5" /> </BehaviorTree> </root> )"; int main() { using namespace BT; MyLegacyMoveTo move_to; // Here we use a lambda that captures the reference of move_to auto MoveToWrapperWithLambda = [&move_to](TreeNode& parent_node) -> NodeStatus { Point3D goal; // thanks to paren_node, you can access easily the input and output ports. parent_node.getInput("goal", goal); bool res = move_to.go( goal ); // convert bool to NodeStatus return res ? NodeStatus::SUCCESS : NodeStatus::FAILURE; }; BehaviorTreeFactory factory; // Register the lambda with BehaviorTreeFactory::registerSimpleAction PortsList ports = { BT::InputPort<Point3D>("goal") }; factory.registerSimpleAction("MoveTo", MoveToWrapperWithLambda, ports ); auto tree = factory.createTreeFromText(xml_text); tree.tickRoot(); return 0; } /* Expected output: Going to: -1.000000 3.000000 0.500000 */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2017-04-25 第十一课,ROS与传感器
2017-04-25 第十课,ROS仿真2
2017-04-25 第九课,ROS仿真1