zoukankan      html  css  js  c++  java
  • 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
    ", 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
    
    */
  • 相关阅读:
    idea 缺失右侧maven窗口
    SpringCloud
    Java面试题——Java基础
    json对象、json字符串的区别和相互转换
    java中的 private Logger log=Logger.getLogger(this.getClass());
    http网络编程
    ansible和helm
    template模板
    http中get和post请求方式
    session和cookie
  • 原文地址:https://www.cnblogs.com/gary-guo/p/14700841.html
Copyright © 2011-2022 走看看