gpt4 book ai didi

javascript - 在运行时动态创建和存储算法

转载 作者:行者123 更新时间:2023-11-30 02:48:19 24 4
gpt4 key购买 nike

假设我有一些用 C++ 编写和编译的函数:

int quicksum(int a, int b){ return a+b; }
int quickmult(int a, int b){ return a*b; }

运行时,我希望能够创建这些函数的组合,例如quicksum(quickmult(5,6),7) 并保持将其作为我可以随时执行的已保存程序。

目前,我通过在 Qt 中同时使用 JavaScript 和 C++ 完成了一半,其中像 quicksum 这样的函数是在 C++ 中定义的,然后通过这样做从 JavaScript 调用:

    var somestring="quicksum(5,(quicksum(4,4)))"
eval(somestring)

现在可以了,但问题是这些函数的组合仍然在 JavaScript 端进行管理,这意味着 JS 正在处理一个函数的返回,然后再将其输入到另一个函数,而不是 C++ 运行整个组合本身(至少我认为是这种情况)。

我不介意在 JS 中创建初始组合,但出于性能原因,我不希望每次需要调用函数组合时都涉及 JS。

有没有办法以某种方式将这些函数组合放入 C++ 端,并让它留在那里供以后运行?我不介意将 JS 完全从流程中移除,这只是我能想到的唯一方法;也许有一些巧妙的方法可以在 C++ 中使用仿函数在运行时动态地将先前编译过的函数拼接在一起?

更新...

我正在考虑的另一种选择是使用本身具有引用其他仿函数的成员变量的仿函数。如果 JS 调用带有其他仿函数参数的仿函数构造函数,这有点像在运行时创建一个带有闭包的新函数。那么这个仿函数将完全是一个 C++ 对象,其中存储了过程(我认为)。我需要花点时间在脑海中解决这个问题。

最佳答案

评估一个运行时构造的函数在任何合理的意义上都不会“快速”,除非你全力以赴并编译它,例如到动态库。

除非你可以构造一个动态表达式树。

与下面的代码相比,您可能想要添加一些语法糖,但它显示了基础知识:

#include <iostream>
#include <functional> // std::plus, std::multiplies
#include <memory> // std::unique_ptr
#include <utility> // std::move
using namespace std;

struct Expression
{
virtual auto eval() const -> double = 0;
virtual ~Expression() {}
};

struct Number: Expression
{
double value;

auto eval() const -> double override { return value; }

Number( double v ): value( v ) {}
};

struct Binary_op: Expression
{
unique_ptr<Expression> a;
unique_ptr<Expression> b;

Binary_op( unique_ptr<Expression> _a, unique_ptr<Expression> _b )
: a( move( _a ) ), b( move( _b ) )
{}
};

template< class Impl >
struct Concrete_binary_op: Binary_op
{
auto eval() const -> double override
{ return Impl()( a->eval(), b->eval() ); }

Concrete_binary_op( unique_ptr<Expression> _a, unique_ptr<Expression> _b )
: Binary_op( move( _a ), move( _b ) )
{}
};

using Sum = Concrete_binary_op<std::plus<double>>;
using Product = Concrete_binary_op<std::multiplies<double>>;

auto number( double v )
-> unique_ptr<Number>
{ return unique_ptr<Number>( new Number( v ) ); }

auto sum( unique_ptr<Expression> a, unique_ptr<Expression> b )
-> unique_ptr<Sum>
{ return unique_ptr<Sum>( new Sum( move( a ), move( b ) ) ); }

auto product( unique_ptr<Expression> a, unique_ptr<Expression> b )
-> unique_ptr<Product>
{ return unique_ptr<Product>( new Product( move( a ), move( b ) ) ); }

auto main()
-> int
{
auto e = sum( product( number( 5 ), number( 6 ) ), number( 7 ) );
cout << e->eval() << endl;
}

关于javascript - 在运行时动态创建和存储算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22085990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com