是的,我知道动态变量在c++中是不可能的。我正在寻找一种解决方法。
这个想法基本上就是这个。我在一起有一堆数学模型。它们都具有完全相同的形式,除了
这些常数的值可能会在实验之间发生变化,但是其他所有内容都是 Material 模型本身的属性。在输入文件中以以下形式给出模型的常数参数
variable_A=2.0
Material 模型(包括所有功能)以前是通过生成的代码创建的,通过Maple从抽象的数学表达式生成的,并具有良好的GUI环境来启动。现在,由于多种原因,这一问题被打破了。由于进行了其他一些工作,这些模型现在在代码上都完全相同,只是在形式描述上有所不同。我正在寻找一个更简单的替代方案,而不是使用一个完整的程序来生成此代码(当前已被破坏,并且以前使用过此代码),因为现在在给定的文件中仅需要大约20行就可以将一种 Material 与另一个。但是,不希望实现这些模型的用户了解c++。因此,尽管我可以简单地要求他们遍历文件并在各个位置进行更改,但我仍在寻找一些对用户更友好的方法:因此用户可以在一个位置更改几行并以此方式定义他们的模型,无需查看其余代码。
用户定义的功能如下所示。
double myfunction(double arg1, double arg2, vector arg3 ) \\just an example
{
...
...
double a=database.find_constant("a_const");
double b=database.find_constant("b_const");
return sqrt(a*3+pow(b,2)-a/b)+...; \\still example pseudocode
}
顶级省略号相当丑陋(不错的代码,语法繁琐且无关紧要),因此我不希望最终用户必须处理它们。通过示例可以更好地描述我的问题:
我最初的计划是在顶部使用宏(是的,我知道,是恐怖的),这样它可以变成类似
#define A database.find_constant("a_const")
#define FUNCTION pow(A-2,3)
...
double myfunction(...)
{
...
return FUNCTION;
}
但是后来我发现您不能嵌套宏。回想起来很明显,但是我离题了。然后我意识到我可以更改
#define A
语句以使A
成为全局变量。然后我什至不考虑全局变量。基本上,我将所有这些都放在用户不需要太多C++知识的地方的尝试都是荒谬的和/或极其不安全的。通常我不喜欢问这样的开放性问题,但是我真的不想让自己头痛。我只会在这个项目上工作很短的时间,因此设计某种形式的UI和/或生成代码是不切实际的。我现在正在寻求“概念验证”。
是否有比让它们遍历模型并直接更改函数中所需行更好的方法呢?
编辑:我没有写这整个项目,也不是最初打算以这种方式工作。我们用于生成这些文件的原始工具使用了Maple的代码生成,在其中,函数和变量以Maple语法的形式输入到一个漂亮的GUI中。不幸的是,GUI似乎不再(始终如一)运行,并且在切换版本后Maple返回的代码停止产生正确的结果:我们不确定问题到底出在哪里,我们现在正在探索其他途径。由于其他工作,新文件也比以前的文件更加相似,这是采用新技术的动力之一。我希望如果只需要几行就可以以一种简单的方式一起工作,那么我可以解决代码生成问题。这不是“为我修复”!问题,我只想了解其他选项可能是什么。是的,我知道这不是一个好的开始,如果从一开始就计划好了,就不会这样。但是这种设置可能只是暂时的,而且正如我所说的,它比其他任何东西都更能证明概念。
希望这个问题现在更清楚了。我的问题特别是要以一种易于使用的方式将所有内容分组在一个地方。感谢您的耐心等待。
最佳答案
您可以尝试将“功能”像宏一样,但不能将宏的各个功能组封装在匿名结构中:
struct
{
double find_constant(const char* s) { do-stuff...; }
double calc_value(int a, int b) { do-stuff...; }
...
} GeneralStuff;
使用宏访问此结构中的函数:
#define DoStuff GeneralStuff
并在您的代码中访问它:
...
DoStuff.find_constant("a_const");
...
如果用户需要更改代码,则可以复制该结构,应用更改,然后
重新定义宏:
struct
{
...changed code...
} MyStuff;
#define DoStuff MyStuff
如果我正确理解您的问题,那么这些就是唯一需要的更改。
关于c++ - 创建动态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11271187/