c++ - 在运行时定义 C++ 函数

标签 c++ function-pointers functor

我正在尝试调整我编写的一些数学代码以允许任意函数,但我似乎只能通过在编译时预定义它们来做到这一点,这看起来很笨拙。我目前正在使用函数指针,但据我所知,仿函数也会出现同样的问题。举一个简单的例子,前向差分微分使用的代码是:

double xsquared(double x) {
    return x*x;
}

double expx(double x) {
    return exp(x);
}

double forward(double x, double h, double (*af)(double)) {
    double answer = (af(x+h)-af(x))/h;

    return answer;  
}

前两个函数中的任何一个都可以作为第三个参数传递。然而,我想做的是传递用户输入(在有效的 C++ 中),而不是必须事先设置函数。任何帮助将不胜感激!

最佳答案

从历史上看,您要求的那种功能在 C++ 中不可用。通常的解决方法是为 C++ 以外的语言嵌入解释器(例如,Lua 和 Python 专门设计用于集成到 C/C++ 应用程序中以允许编写脚本),或者使用您的应用程序创建一种特定于您的应用程序的新语言自己的解析器、编译器等。但是,这正在改变。

Clang 是一种新的开源编译器,由 Apple 利用 LLVM 开发。 Clang 从头开始​​设计,不仅可以用作编译器,还可以用作可以嵌入到应用程序中的 C++ 库。我自己还没有尝试过,但您应该能够使用 Clang 做您想做的事——您可以将它链接为一个库,并要求它编译您的用户输入到应用程序中的代码。

您可以尝试查看 how the ClamAV team already did this, so that new virus definitions can be written in C .

至于其他编译器,我知道GCC最近增加了对插件的支持。或许可以利用它来桥接 GCC 和您的应用程序,但由于 GCC 从一开始就不是为用作库而设计的,因此可能会更加困难。我不知道有任何其他编译器具有类似的能力。

关于c++ - 在运行时定义 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4949987/

相关文章:

c - Linux Kernel - 为什么一个函数在 System.map 中的地址比实时看到的地址早一个字节?

c++ - 转发成员函数到静态方法

c++ - 按原样保存用户输入-Ruby on Rails

android - 将图像转换为无符号字符*

c - 返回指向函数错误的指针

c++ - 如何使用仿函数和 operator() 实现委托(delegate)

c++ - 导致运行时执行的 constexpr 仿函数中的成员

go - 在泛型 go 中模拟方法类型参数

c++ - 为什么允许这种转换?

c++ - 无法创建具有值和绑定(bind)的 std::ranges::iota_view